
No.3ベストアンサー
- 回答日時:
なるほど。
わかりました。
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)
で行けるでしょう。
No.5
- 回答日時:
> CSV_record[CSV_item_num, i] = subStr;
>のところで「インデックスが配列の境界外です。」というエラーがでてしまいます
とおっしゃってますが for文の列のカウンタとしてiを使ってますよね
それなのに foreachで列を分解し iをカウントアップ
このforeachループを抜けたあと forループでカウントアップされ
45*45列生成しようとしているため インデックスが境界を越えてしまうのです
No.2
- 回答日時:
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]から三行目を読み・・・としていきたいのですが、どうすればいいのでしょうか。。
No.1
- 回答日時:
そのプログラムをここに書いてみせてくださいな。
きっと、あっさり解決しますよ?
この回答への補足
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列目まで代入したところで、二行目にうつってくれません。。なぜでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javascriptのイベント処理につ...
-
JavaScriptからJAVAクラスを呼...
-
Tomcat高負荷時の設定について
-
WPF C#でF10のイベント取得方法...
-
Javaプログラムからポップアッ...
-
JSPで「処理中」をブラウザに表示
-
中学のクラス数
-
「タイプ初期化子が例外をスロ...
-
ヒグマを撃退
-
【sendkeysメソッドが動かずに...
-
エクセルVBAで、条件に一致する...
-
オブジェクト参照がオブジェク...
-
0歳児の指しゃぶりに関して
-
javascriptからjavaを呼び出したい
-
サーブレットコンテキストの意...
-
単体テスト仕様書[正常系/異常...
-
インスタンスを同じ名前で作成...
-
Excel VBA 定数にオブジェクト...
-
どこからも呼ばれていない無意...
-
河合塾
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Javaプログラムからポップアッ...
-
Javaでのデバッグコード削除
-
tryの終了
-
Tomcat高負荷時の設定について
-
SwingUtilities.invokeLater(ne...
-
ラベルの表示までが異常に遅い...
-
vba Sleep関数について教えてく...
-
Delphiのマルチスレッドの割り...
-
ラジオボタンの選択判定
-
アコーディオンメニューをアン...
-
JSP、サーブレットの初期処理
-
ftp 同時複数接続の負荷テスト...
-
[Java] while(true)の意味
-
C#で別スレッドの終了を知りたい
-
switch文の中に、throws new Ex...
-
アロー関数がよくわかりません
-
セル範囲で文字を検索はFor必須?
-
PHP
-
Servlet+JSPを使ったWEBアプリ...
-
Javaプログラムから外部コマン...
おすすめ情報