重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

C#を使っています。
エクセルのデータを、カンマ区切り(CSV)にして保存しました。
そのデータをそのまま二次元配列に代入していきたいのですが、うまくできません(><)
データの一行目しか代入しなかったりします。。二行目にうつってくれません。まだまだ初心者なのですが、どうか教えてください(><)

A 回答 (5件)

なるほど。


わかりました。

while ((CSV_data = CSV_reader.ReadToEnd()) != null)

  StreamReader の ReadToEnd() は
  ファイルの中身を全部読み込むメソッドです。
  whileでくるくる処理するものではありません。

  一気に全部読み込んでおいて、その中で

for (int i = 0; i < columns; i++)

  でくるくる回して、処理を抜けるようになっています。
  ご自分で、「45個までしか処理しない」と書いたわけです。

*****
ReadToEnd() を使いたいのでしたら、
(1)まずReadToEndで一気に読み込み、
(2)それを改行コードでSplitし、
(3)一行ずつくるくる回しながら、一行を「,」でSplit
という風に書きます。

しかし、ReadToEnd() にこだわらないのでしたら、
ReadLine()を使ったほうがよいでしょう。
これは、ファイルを一行ずつ読み込むメソッドです。

while ((CSV_data = CSV_reader.ReadToEnd()) != null)
      ↓↓
while ((CSV_data = CSV_reader.ReadLine()) != null)

で行けるでしょう。
    • good
    • 0

> CSV_record[CSV_item_num, i] = subStr;


>のところで「インデックスが配列の境界外です。」というエラーがでてしまいます

とおっしゃってますが for文の列のカウンタとしてiを使ってますよね
それなのに foreachで列を分解し iをカウントアップ
このforeachループを抜けたあと forループでカウントアップされ
45*45列生成しようとしているため インデックスが境界を越えてしまうのです
    • good
    • 0

そのものずばりのページ


http://www.atmarkit.co.jp/fdotnet/dotnettips/036 …
    • good
    • 0

CSVファイルからの読み込みを ReadToEndメソッドで行っていますが


このメソッドは 現在位置から最終位置まで一気に読み込みます

その後の処理が 1行つまり45列の取り込みですよね
その処理終了後 もう一度 ReadToEndを実行してももうデータは読み込んでしまったので nullが返されて whileループを終了します

したがって 1行目のみ取り込んで終了となってしまうのです

while ( ( CSV_data = CSV_reader.ReadLine() ) != null )
と記述してみましょう

この回答への補足

そうなんです(><)
最初はReadLineでしていたのですが、そうすると
CSV_record[CSV_item_num, i] = subStr;
のところで「インデックスが配列の境界外です。」というエラーがでてしまいます。

途中までデバッグしてみると、CSV_recordには[0,0]~[0,45]まで読んだあと、[1,0]からは全部nullになっているんです。つまり、一行読んだらnullとなってしまっているんです。それを、[1,0]から二行目を読み、[2,0]から三行目を読み・・・としていきたいのですが、どうすればいいのでしょうか。。

補足日時:2007/11/13 00:53
    • good
    • 0

そのプログラムをここに書いてみせてくださいな。


きっと、あっさり解決しますよ?

この回答への補足

string CSV_data;
int CSV_item_num = 0;
int columns =45;
string[,] CSV_record = new string[200, 45];

StreamReader CSV_reader = new StreamReader("E:\\sample\\CSV.csv", Encoding.GetEncoding("Shift_JIS"));

while ((CSV_data = CSV_reader.ReadToEnd()) != null)
{
for (int i = 0; i < columns; i++)
{
const char Comma =',';
char[] delimiters = new char[] { Comma };

foreach (string subStr in CSV_data.Split(delimiters))
{
CSV_record[CSV_item_num, i] = subStr;
i++;
}
} CSV_item_num++;
}

こんな感じのプログラムをかいてます。
CSVというデータをCSV_recordという配列に代入したいんです。
データは縦200、横45の列と行からなってます。カンマで区切ってそのままの形で、代入していきたいんです。
しかし、横45列目まで代入したところで、二行目にうつってくれません。。なぜでしょうか。

補足日時:2007/11/13 00:32
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!