C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: csvファイルの1行目をヘッダにする方法


(過去ログ 93 を表示中)

[トピック内 21 記事 (1 - 20 表示)]  << 0 | 1 >>

■55486 / inTopicNo.1)  csvファイルの1行目をヘッダにする方法
  
□投稿者/ daibo (13回)-(2010/12/03(Fri) 13:29:17)

分類:[C#] 

よろしくお願いします。
以前DataGridViewにcsvファイルの内容を読み込む方法を尋ねたものですが、皆さんのご指摘を受け、なんとか読み込めるようになりました。
しかし、タイトルの通り、csvファイルの内容の1行目をヘッダにする方法が分からず苦労しています。
以下にソースコードを書きますのでご指摘お願いします。

private void reed_button_Click(object sender, EventArgs e)
        {
            DataSet dataset_sam = new DataSet();
            dataset_sam.Tables.Add("sample");
            dataset_sam.Tables["sample"].Columns.Add("");
            dataset_sam.Tables["sample"].Columns.Add("");
            dataset_sam.Tables["sample"].Columns.Add("");
            dataset_sam.Tables["sample"].Columns.Add("");
            dataset_sam.Tables["sample"].Columns.Add("");
            System.IO.StreamReader StreamReader = new System.IO.StreamReader(@"C:\csv.csv", System.Text.Encoding.GetEncoding(932));
            while (StreamReader.Peek() != -1)
            {

                string[] stringBuffer;
                stringBuffer = StreamReader.ReadLine().Split(',');
                //DataSetの作成 
                DataRow row = dataset_sam.Tables["sample"].NewRow();
                for (int counter = 0; counter < row.ItemArray.Length; counter++)
                {
                    row[counter] = stringBuffer[counter];
                }
                dataset_sam.Tables["sample"].Rows.Add(row);
            }
            StreamReader.Close();

            dataGridView1.DataSource = dataset_sam;
            dataGridView1.DataMember = "sample";
        }

引用返信 編集キー/
■55490 / inTopicNo.2)  Re[1]: csvファイルの1行目をヘッダにする方法
□投稿者/ todo (69回)-(2010/12/03(Fri) 15:13:57)
1行目をこんな感じで読み込めばよいはずです。

string[] stringBuffer = StreamReader.ReadLine().Split(',');
foreach (string s in stringBuffer) {
dataset_sam.Tables["sample"].Columns.Add(s);
}


引用返信 編集キー/
■55491 / inTopicNo.3)  Re[2]: csvファイルの1行目をヘッダにする方法
□投稿者/ daibo (15回)-(2010/12/03(Fri) 15:22:17)
No55490 (todo さん) に返信
> 1行目をこんな感じで読み込めばよいはずです。
> 
> string[] stringBuffer = StreamReader.ReadLine().Split(',');
> foreach (string s in stringBuffer) {
> 	dataset_sam.Tables["sample"].Columns.Add(s);
> }
> 
> 
早速の返答ありがとうございます。
しかし、その通りにしたら[配列がインデックスの境界外です。]と
row[counter] = stringBuffer[counter];

のところで例外が発生しました。
1行目をヘッダにするということで変数[counter]を0からではなく、1から開始しても同じ例外が発生しました。
申し訳ありませんがこの解決法も同時に教えていただけたら幸いに存じます。

引用返信 編集キー/
■55492 / inTopicNo.4)  Re[3]: csvファイルの1行目をヘッダにする方法
□投稿者/ todo (70回)-(2010/12/03(Fri) 15:34:08)
dataset_sam.Tables["sample"].Columns.Add("");
dataset_sam.Tables["sample"].Columns.Add("");
dataset_sam.Tables["sample"].Columns.Add("");
dataset_sam.Tables["sample"].Columns.Add("");
dataset_sam.Tables["sample"].Columns.Add("");

トル
引用返信 編集キー/
■55493 / inTopicNo.5)  Re[3]: csvファイルの1行目をヘッダにする方法
□投稿者/ ごう (216回)-(2010/12/03(Fri) 15:38:03)
2010/12/03(Fri) 15:42:00 編集(投稿者)
No55491 (daibo さん) に返信
>>string[] stringBuffer = StreamReader.ReadLine().Split(',');
>>foreach (string s in stringBuffer) {
>>	dataset_sam.Tables["sample"].Columns.Add(s);
>>}

デバッガを使いましょう。
foreachの行にブレークポイントを仕込んで、stringBufferのLengthがいくつか調べてみては?
多分、DataTableに設定したいColumnの数(ソースみた感じだと5個ですよね。)より多いんじゃないかと思います。
つまり、CSVには1行あたり、区切りのカンマはいくつ仕込んであったのでしょう?

追記: あ、foreach分の前にも5個分の
 dataset_sam.Tables["sample"].Columns.Add(""); (※空文字の列名)
が記述されているのか。



引用返信 編集キー/
■55494 / inTopicNo.6)  Re[3]: csvファイルの1行目をヘッダにする方法
□投稿者/ shu (223回)-(2010/12/03(Fri) 15:39:01)
No55491 (daibo さん) に返信

ファイル読込前の項目を作成をしないで
先頭行を読むタイミングで項目を作成すれば良いかと思います。


引用返信 編集キー/
■55497 / inTopicNo.7)  Re[4]: csvファイルの1行目をヘッダにする方法
□投稿者/ daibo (16回)-(2010/12/03(Fri) 16:06:04)
No55492 (todo さん) に返信
>            dataset_sam.Tables["sample"].Columns.Add("");
>             dataset_sam.Tables["sample"].Columns.Add("");
>             dataset_sam.Tables["sample"].Columns.Add("");
>             dataset_sam.Tables["sample"].Columns.Add("");
>             dataset_sam.Tables["sample"].Columns.Add("");
> 
> トル

何度も質問してすいません。
      DataSet dataset_sam = new DataSet();
            dataset_sam.Tables.Add("sample");
            System.IO.StreamReader StreamReader = new System.IO.StreamReader(@"C:\csv.csv", System.Text.Encoding.GetEncoding(932));
            while (StreamReader.Peek() != -1)
            {

                string[] stringBuffer = StreamReader.ReadLine().Split(',');
                foreach (string s in stringBuffer)
                {
                    dataset_sam.Tables["sample"].Columns.Add(s);

                }
                //DataSetの作成 
                DataRow row = dataset_sam.Tables["sample"].NewRow();
                for (int counter = 0; counter < row.ItemArray.Length; counter++)
                {
                    row[counter] = stringBuffer[counter];
                }
                dataset_sam.Tables["sample"].Rows.Add(row);
            }

このようにしてみましたがまだ例外が発生してしまいます。

引用返信 編集キー/
■55499 / inTopicNo.8)  Re[5]: csvファイルの1行目をヘッダにする方法
□投稿者/ shu (224回)-(2010/12/03(Fri) 16:38:05)
No55497 (daibo さん) に返信
先頭行は1回だけ読込んで下さい。(whileループの前)
これだと全行をタイトル行とデータ行の両方として扱う事になってしまいます。
引用返信 編集キー/
■55500 / inTopicNo.9)  Re[6]: csvファイルの1行目をヘッダにする方法
□投稿者/ daibo (18回)-(2010/12/03(Fri) 16:58:04)
2010/12/03(Fri) 16:59:35 編集(投稿者)
No55499 (shu さん) に返信
> ■No55497 (daibo さん) に返信
> 先頭行は1回だけ読込んで下さい。(whileループの前)
> これだと全行をタイトル行とデータ行の両方として扱う事になってしまいます。

	    DataSet dataset_sam = new DataSet();
            dataset_sam.Tables.Add("sample");
            dataset_sam.Tables["sample"].Columns.Add();
            dataset_sam.Tables["sample"].Columns.Add();
            dataset_sam.Tables["sample"].Columns.Add();
            dataset_sam.Tables["sample"].Columns.Add();
            dataset_sam.Tables["sample"].Columns.Add();
            System.IO.StreamReader StreamReader = new System.IO.StreamReader(@"C:\csv.csv", System.Text.Encoding.GetEncoding(932));
            //DataSetの作成 
            DataRow row = dataset_sam.Tables["sample"].NewRow();
            string[] stringBuffer = StreamReader.ReadLine().Split(',');
            foreach (string s in stringBuffer)
            {
                dataset_sam.Tables["sample"].Columns.Add(s);

            } 
            while (StreamReader.Peek() != -1)
            { 
                for (int counter = 2; counter < row.ItemArray.Length; counter++)
                {
                    row[counter] = stringBuffer[counter];
                }
                dataset_sam.Tables["sample"].Rows.Add(row);
            }
            StreamReader.Close();

            dataGridView1.DataSource = dataset_sam;
            dataGridView1.DataMember = "sample";
こういうことでしょうか?

引用返信 編集キー/
■55501 / inTopicNo.10)  Re[7]: csvファイルの1行目をヘッダにする方法
□投稿者/ shu (225回)-(2010/12/03(Fri) 17:09:52)
No55500 (daibo さん) に返信
> こういうことでしょうか?
whileの前だけでなく、while内にもファイルからの読み込み処理がないと駄目です。

引用返信 編集キー/
■55502 / inTopicNo.11)  Re[8]: csvファイルの1行目をヘッダにする方法
□投稿者/ daibo (19回)-(2010/12/03(Fri) 17:23:12)
No55501 (shu さん) に返信
> ■No55500 (daibo さん) に返信
>>こういうことでしょうか?
> whileの前だけでなく、while内にもファイルからの読み込み処理がないと駄目です。
> 
DataSet dataset_sam = new DataSet();
            dataset_sam.Tables.Add("sample");
            dataset_sam.Tables["sample"].Columns.Add("");
            dataset_sam.Tables["sample"].Columns.Add("");
            dataset_sam.Tables["sample"].Columns.Add("");
            dataset_sam.Tables["sample"].Columns.Add("");
            dataset_sam.Tables["sample"].Columns.Add("");
            System.IO.StreamReader StreamReader = new System.IO.StreamReader(@"C:\csv.csv", System.Text.Encoding.GetEncoding(932));
            //DataSetの作成 
            DataRow row = dataset_sam.Tables["sample"].NewRow();
            string[] stringBuffer = StreamReader.ReadLine().Split(',');
            foreach (string s in stringBuffer)
            {
                dataset_sam.Tables["sample"].Columns.Add(s);

            } 
            while (StreamReader.Peek() != -1)
            {
                System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\csv.csv", System.Text.Encoding.GetEncoding(932));
                string[] st = StreamReader.ReadLine().Split(',');
                
                for (int counter = 1; counter < row.ItemArray.Length; counter++)
                {
                    row[counter] = st[counter];
                }
                dataset_sam.Tables["sample"].Rows.Add(row);
            }
            StreamReader.Close();

            dataGridView1.DataSource = dataset_sam;
            dataGridView1.DataMember = "sample";
こうでしょうか?

引用返信 編集キー/
■55503 / inTopicNo.12)  Re[9]: csvファイルの1行目をヘッダにする方法
□投稿者/ shu (226回)-(2010/12/03(Fri) 17:45:08)
No55502 (daibo さん) に返信
> System.IO.StreamReader sr = new System.IO.StreamReader 〜
こっちはファイルを開く処理なのでいらないです。

> string[] st = StreamReader.ReadLine().Split(',');
こっちだけです。

引用返信 編集キー/
■55504 / inTopicNo.13)  Re[1]: csvファイルの1行目をヘッダにする方法
□投稿者/ オショウ (565回)-(2010/12/03(Fri) 17:48:35)
> しかし、タイトルの通り、csvファイルの内容の1行目をヘッダにする方法が分からず苦労しています。

  OleDbでCSVをデータベースのように開けば、1行目のヘッダーは
  そのまま取り込めます。

※ schema.iniファイルを定義しないといけない場合もありますが
  CSVの1行目のデータをそのまま加工しないでヘッダーにする
  だけなら、苦労することないのですが。

以上。参考まで

引用返信 編集キー/
■55505 / inTopicNo.14)  Re[2]: csvファイルの1行目をヘッダにする方法
□投稿者/ マサヤ (180回)-(2010/12/03(Fri) 18:03:28)
dataGridView1.Columns[0].HeaderText = "ヘッダーテキスト";
これのことでしょうか?

引用返信 編集キー/
■55506 / inTopicNo.15)  Re[10]: csvファイルの1行目をヘッダにする方法
□投稿者/ daibo (20回)-(2010/12/03(Fri) 18:13:03)
No55503 (shu さん) に返信
> ■No55502 (daibo さん) に返信
>>System.IO.StreamReader sr = new System.IO.StreamReader 〜
> こっちはファイルを開く処理なのでいらないです。
> 
>>string[] st = StreamReader.ReadLine().Split(',');
> こっちだけです。
> 
ソースコード書き直してデバッグしてみたところ、streamBuffer[]にはcsvファイルの1行目の内容が格納されていたのですが、st[]には2行目の内容が格納された後、例外が発生してしまいました。以下のソースコードのおかしい点を指摘していただけたら幸いに存じます。


DataSet dataset_sam = new DataSet();
            dataset_sam.Tables.Add("sample");
            dataset_sam.Tables["sample"].Columns.Add("");
            dataset_sam.Tables["sample"].Columns.Add("");
            dataset_sam.Tables["sample"].Columns.Add("");
            dataset_sam.Tables["sample"].Columns.Add("");
            dataset_sam.Tables["sample"].Columns.Add("");
            System.IO.StreamReader StreamReader = new System.IO.StreamReader(@"C:\csv.csv", System.Text.Encoding.GetEncoding(932));
            //DataSetの作成 
            DataRow row = dataset_sam.Tables["sample"].NewRow();
            string[] stringBuffer = StreamReader.ReadLine().Split(',');
            foreach (string s in stringBuffer)
            {
                dataset_sam.Tables["sample"].Columns.Add(s);

            } 
            while (StreamReader.Peek() != -1)
            {
                string[] st = StreamReader.ReadLine().Split(',');
                
                for (int counter = 1; counter < row.ItemArray.Length; counter++)
                {
                    row[counter] = st[counter];
                }
                dataset_sam.Tables["sample"].Rows.Add(row);
            }
            StreamReader.Close();

            dataGridView1.DataSource = dataset_sam;
            dataGridView1.DataMember = "sample";

引用返信 編集キー/
■55508 / inTopicNo.16)  Re[3]: csvファイルの1行目をヘッダにする方法
□投稿者/ todo (71回)-(2010/12/03(Fri) 18:54:04)
2010/12/03(Fri) 19:03:36 編集(投稿者)
2010/12/03(Fri) 18:56:46 編集(投稿者)

DataTableに名前がないカラムを5個追加する代わりに、CSVファイルのヘッダ行(1行目)を読み込んで名前付きのカラムをDataTableに追加する。
2行以降(データ行)はもともとの方法で読み込む。
それだけです。

DataRow row = dataset_sam.Tables["sample"].NewRow();
何でこの行がループの外で出ちゃうのですか?
引用返信 編集キー/
■55540 / inTopicNo.17)  Re[4]: csvファイルの1行目をヘッダにする方法
□投稿者/ daibo (21回)-(2010/12/06(Mon) 08:51:50)
No55508 (todo さん) に返信
> 2010/12/03(Fri) 19:03:36 編集(投稿者)
> 2010/12/03(Fri) 18:56:46 編集(投稿者)
> 
> DataTableに名前がないカラムを5個追加する代わりに、CSVファイルのヘッダ行(1行目)を読み込んで名前付きのカラムをDataTableに追加する。
> 2行以降(データ行)はもともとの方法で読み込む。
> それだけです。
> 
> DataRow row = dataset_sam.Tables["sample"].NewRow();
> 何でこの行がループの外で出ちゃうのですか?

返事が遅くなってしまい申し訳ありません。まだ解決していないのでお付き合いしていただきたく思います。
ご指摘された点を直してみたのですが、for文の部分で2行目のデータを取得するところまでは大丈夫なのですが、それ以降のデータを取得する段階で[インデックスが配列の境界外です]と例外が発生します。
以下のソースコードの問題点とその解決策をご教授していただけたら幸いに存じます。

DataSet dataset_sam = new DataSet();
            dataset_sam.Tables.Add("sample");
            dataset_sam.Tables["sample"].Columns.Add("");
            dataset_sam.Tables["sample"].Columns.Add("");
            dataset_sam.Tables["sample"].Columns.Add("");
            dataset_sam.Tables["sample"].Columns.Add("");
            dataset_sam.Tables["sample"].Columns.Add("");
            System.IO.StreamReader StreamReader = new System.IO.StreamReader(@"C:\Users\KOMATSU\Desktop\csv.csv", System.Text.Encoding.GetEncoding(932));
            //DataSetの作成 
            
            string[] stringBuffer = StreamReader.ReadLine().Split(',');
            foreach (string s in stringBuffer)
            {
                dataset_sam.Tables["sample"].Columns.Add(s);

            } 
            while (StreamReader.Peek() != -1)
            {
                string[] st = StreamReader.ReadLine().Split(',');
                DataRow row = dataset_sam.Tables["sample"].NewRow();
                for (int counter = 1; counter < row.ItemArray.Length; counter++)
                {
                    row[counter] = st[counter];
                }
                dataset_sam.Tables["sample"].Rows.Add(row);
            }
            StreamReader.Close();

            dataGridView1.DataSource = dataset_sam;
            dataGridView1.DataMember = "sample";

引用返信 編集キー/
■55541 / inTopicNo.18)  Re[5]: csvファイルの1行目をヘッダにする方法
□投稿者/ ごう (220回)-(2010/12/06(Mon) 09:12:43)
No55540 (daibo さん) に返信

> for (int counter = 1; counter < row.ItemArray.Length; counter++)
> {
> row[counter] = st[counter];
> }

の、 for分のあたりにブレークポイント設定して、
デバッガで「row.ItemArray.Length」の値見てごらん?

1. いくつになってる?
2. 貴殿がDataGridViewに表示したい列数はいくつなの?
3. 1と2は一致してる?


# これで気づいてくれるかな・・・?
# 「インデックスが配列の境界外です」について、今後の参考に。
# http://oshiete.goo.ne.jp/qa/5133906.html
# つまり、「存在しない配列」にアクセスしようとしているから、例外やエラーになるのです。
# 自分が作った配列(DataGridViewであるのなら、列や行の数)と、使いたい数が一致しているかどうか
# 一致していないなら、どうして一致しないのか考えましょう。
引用返信 編集キー/
■55542 / inTopicNo.19)  Re[5]: csvファイルの1行目をヘッダにする方法
□投稿者/ shu (232回)-(2010/12/06(Mon) 09:18:33)
No55540 (daibo さん) に返信

いままでの回答を全部読み返してみて下さい。

引用返信 編集キー/
■55544 / inTopicNo.20)  Re[6]: csvファイルの1行目をヘッダにする方法
 
□投稿者/ マサヤ (181回)-(2010/12/06(Mon) 10:04:40)
こういうことをしたいのではなくて?
using (StreamReader sr = new StreamReader(fileFullPath, Encoding.UTF8))
            {
                string readLine = string.Empty;
                char delimiterChar = ',';
                bool firstFlg = true;
                string firstWord = string.Empty;
                string secondWord = string.Empty;
                string thirdWord = string.Empty;               
                while (sr.EndOfStream == false)
                {
                    readLine = sr.ReadLine();
                    string[] readField = readLine.Split(delimiterChar);
                    
                    if (!firstFlg)
                    {
                        DataRow dr = dt.NewRow();
                        dr[firstWord] = readField[0].ToString();
                        dr[secondWord] = readField[1].ToString();
                        dr[thirdWord] = readField[2].ToString();
                        dt.Rows.Add(dr);
                    }
                    else
                    {
                        firstWord = readField[0].ToString();
                        secondWord = readField[1].ToString();
                        thirdWord = readField[2].ToString();
                        dt.Columns.Add(firstWord, typeof(string));
                        dt.Columns.Add(secondWord, typeof(string));
                        dt.Columns.Add(thirdWord, typeof(string));                   
                        firstFlg = false;
                    }
                    readLine = string.Empty;
                }
            }

引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -