DOBON.NET DOBON.NETプログラミング掲示板過去ログ

csvファイルの読み書き

環境/言語:[C#.NET]
分類:[.NET]

はじめまして。KIRIRIと申します。
開発環境 C#.NET2003 です。

現在C#.NET勉強中です。
csvファイルの読込み、編集、保存できるアプリを作成しています。
読み込んだ内容はdataGirdに表示させています。
編集は直接dataGridのセルに記入させようと考えています。

最後の保存をどうしたらいいのかさっぱりわかりません。
どなたか教えていただけないでしょうか?

よろしくお願いします。
2005/09/15(Thu) 17:56:59 編集(投稿者)

■No12803に返信(KIRIRIさんの記事)
DataGridのDataSourceかDataMemberから、DataTableを取り出して、
http://dobon.net/vb/dotnet/file/writefile.html
を参考に出力してみてはいかがでしょう。

private void button1_Click(object sender, System.EventArgs e)
{
  DataTable dt = (DataTable)this.DataGrid1.DataSource;
  System.IO.StreamWriter sw = new System.IO.StreamWriter(@"c:\test.txt", False, System.Text.Encoding.GetEncoding(932));
  try
  {
    foreach (DataRow row in dt.Rows)
    {
      for (int i=0 ; i<dt.Rows.Count ; i++)
      {
        if (i>0)
        {
          sw.Write("\t"); //区切り文字の出力
        }
        sw.Write(row(i));
      }
      sw.WriteLine();
    }
  }
  catch(Exception e)
  {
  }
  finally
  {
    sw.Close();
  }
}
DataGridのまんまをCSVにはくのでしたら、
以前書いた私のつたないソースですが、参考にして下さい。
今思えば、StringBuilderを使うべきでしょうね。

//DataGridをCSVへ変換
static public bool DataGrid2CSV(DataGrid dataGrid, string outFile)
{
    StreamWriter sw = null;
    string strwk = String.Empty;

    try
    {
        //ファイルが存在していたら上書きで開く
        sw = new StreamWriter(outFile, false, Encoding.GetEncoding("Shift-JIS"));

        //ヘッダーの書き出し
        strwk = String.Empty;

        foreach(DataGridColumnStyle myColumnStyle in dataGrid.TableStyles[0].GridColumnStyles)
        {
            strwk += myColumnStyle.HeaderText + ",";
        }

        sw.WriteLine(strwk.Substring(0, strwk.Length - 1));    //最後の,を除く

        //データの書き出し
        strwk = String.Empty;

        int rowcnt = ((CurrencyManager)dataGrid.BindingContext[dataGrid.DataSource, dataGrid.DataMember]).Count;
        int colcnt = dataGrid.TableStyles[0].GridColumnStyles.Count;

        for (int i=0; i < rowcnt; i++)
        {
            strwk = String.Empty;

            for(int j=0; j < colcnt; j++)
            {
                strwk += @"""" + dataGrid[i, j].ToString() + @""",";
            }
        
            sw.WriteLine(strwk.Substring(0, strwk.Length - 1));    //最後の,を除く
        }
        
        return true;
    }
    catch ( Exception ex )
    {
        string s = ex.Message;

        return false;
    }
    finally
    {
        sw.Close();
    }
}
■No12804に返信(なおこ(・∀・)さんの記事)
> private void button1_Click(object sender, System.EventArgs e)
>    :
> }

private void button1_Click(object sender, System.EventArgs e) {
    DataTable dt = (DataTable)this.DataGrid1.DataSource;

    using (System.IO.StreamWriter sw = new System.IO.StreamWriter(@"c:\test.txt", False, System.Text.Encoding.GetEncoding(932))) {
        try {
            foreach (DataRow row in dt.Rows) {
                for (int i = 0; i < dt.Rows.Count; i++) {
            if (i > 0) {
                        sw.Write('\t'); //区切り文字の出力
                    }

                    sw.Write(row(i));
                }

                sw.WriteLine();
            }
      } finally {
            if (sw != null) {
                sw.Close();
            }
        }
    }
}
■No12807に返信(じゃんぬねっとさんの記事)
そうか…C#にはusingがあるんだった…orz
みなさん、レスありがとうございます。

みなさんのレスを参考に作ってみたのですが
実行中にエラーが出てしまいました。
エラーの原因と対策をお聞きしたいのですが
これは、この掲示板の規約違反になるのでしょうか?
ならないのでしたらもう一度質問させていただきたいのですが・・・

よろしくお願いします。
お世話になります。

■No12821に返信(KIRIRIさんの記事)
> みなさん、レスありがとうございます。
>
> みなさんのレスを参考に作ってみたのですが
> 実行中にエラーが出てしまいました。
> エラーの原因と対策をお聞きしたいのですが
> これは、この掲示板の規約違反になるのでしょうか?
> ならないのでしたらもう一度質問させていただきたいのですが・・・
>
> よろしくお願いします。

http://dobon.net/vb/bbs/index.html
によると、上記投稿は、"質問内容が漠然としている投稿"にあたると思いますが…

とりあえず、どんなエラーがでたのか書かないと、
誰も回答できないのでは?と思いますよ。
2005/09/16(Fri) 12:45:04 編集(投稿者)

ありがとうございます。

以下のコードを記述しました。

//保存
private void btnFileSave_Click(object sender, System.EventArgs e){

  //ファイルに書き出し
  using(StreamWriter sw = new System.IO.StreamWriter
              (strFileName,
              false,
              System.Text.Encoding.GetEncoding(932)))
  {
    try
    {
  //dataGrid1のDataSourceをDataTableに取り出す
  DataTable dt = (DataTable)this.dataGrid1.DataSource;

  //DataRowを一つずつ参照
  foreach (DataRow row in dt.Rows)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
if (i > 0)
{
sw.Write('\t'); //区切り文字の出力
}
sw.Write(row[i]); //書き出し
}
sw.WriteLine(); //改行
}

}

//例外処理
catch(Exception er)
{
MessageBox.Show(er.Message,"例外が発生しました。");
}

//例外の有無に関わらず最後に実行する処理
finally
{
sw.Close(); //閉じる
}
}
}

上記の中の
DataTable dt = (DataTable)this.dataGrid1.DataSource;
のところで
「指定されたキャストは有効ではありません。」
というエラーメッセージが出ます。
原因と対策をおしえていただけないでしょうか?

よろしくお願いします。
こんにちは、じゃんぬ です。

■No12824に返信(KIRIRIさんの記事)
> 上記の中の
> DataTable dt = (DataTable)this.dataGrid1.DataSource;
> のところで
> 「指定されたキャストは有効ではありません。」
> というエラーメッセージが出ます。
> 原因と対策をおしえていただけないでしょうか?
>
> よろしくお願いします。

では、次に「中身」を見てください。
dataGrid1.DataSource の「中身」をです。
■No12825に返信(じゃんぬねっとさんの記事)

> では、次に「中身」を見てください。
> dataGrid1.DataSource の「中身」をです。

dataGrid1.DataSourceの中身はdataSet1を設定しています。
dataSet1はフォームに貼り付けてあるものです。
dataSet1のTablesプロパティでテーブルを1つ追加したものを
dataGrid1.DataMemberに設定しています。
  • 題名: Re[9]: csvファイルの読み書き
  • 著者: なおこ(・∀・)
  • 日時: 2005/09/16 13:17:57
  • ID: 12829
  • この記事の返信元:
  • この記事への返信:
    • [12838] 解決 KIRIRI 2005/09/16 14:41:08 [解決]
  • ツリーを表示
お世話になります。

■No12828に返信(KIRIRIさんの記事)
> dataGrid1.DataSourceの中身はdataSet1を設定しています。
DataSetはDataTableにキャストできませんよね。
■No12829に返信(なおこ(・∀・)さんの記事)
> お世話になります。
>
> ■No12828に返信(KIRIRIさんの記事)
>>dataGrid1.DataSourceの中身はdataSet1を設定しています。
> DataSetはDataTableにキャストできませんよね。

dataGrid1.DataSourceの中身をdataSet1から
dataSet1の中で追加したdataTable1に変更したところ
うまくいきました。

みなさん、ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板