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

多次元配列(二次元配列)の初期化について

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

こんにちわ。
CSVファイルの取込み用に多次元配列を使おうと思っているのですが
配列初期化子をどう得たらいいか迷ってます。

string[,] hoge = new string[行,列]
のようにしたいと思ってますがこの「行」「列」の数を求める良い方法は無いでしょうか?

StreamReader を 1回目は行と列を取得するのに回し、2回目は値を得るために回す
というのは思いついたんですけど。。もっといい方法があれば教えて下さい。
よろしくお願いします。
■No5298に返信(HOGEさんの記事)
> こんにちわ。
> CSVファイルの取込み用に多次元配列を使おうと思っているのですが
> 配列初期化子をどう得たらいいか迷ってます。
>
> string[,] hoge = new string[行,列]
> のようにしたいと思ってますがこの「行」「列」の数を求める良い方法は無いでしょうか?
>
> StreamReader を 1回目は行と列を取得するのに回し、2回目は値を得るために回す
> というのは思いついたんですけど。。もっといい方法があれば教えて下さい。
> よろしくお願いします。

1.StreamReaderでまず一気に取得。
2.CSVファイルなのでカンマ区切りであることを考えて、カンマ位置で列を取得。
3.カンマ位置で分割。Split();
4.分割されているので、別途値を求める必要はなし。

でやれば、結構高速で楽なのではないでしょうか?
2004/08/04(Wed) 15:01:15 編集(投稿者)

口だけでは何とでも言えるので、ちょっとやってみました。

// モジュールレベルの宣言
private FileStream mFileStream;
private StreamReader mStreamReader;

// ファイルの中身を一気に取得してやる方法
private void button1_Click(object sender, System.EventArgs e) {
  string nBuffer;
  string[] nDblArray;
  string[][] nTplArray;
  int i;
  int iRow;
  int iCol;

  // 開く
  mFileStream = new FileStream ("CSVFile.csv", FileMode.Open, FileAccess.Read, FileShare.Read);
  mStreamReader = new StreamReader(mFileStream, System.Text.UTF8Encoding.Default);

  // 一気に取得
  nBuffer = mStreamReader.ReadToEnd();

  // とっとと閉じる
  mStreamReader.Close();
  mFileStream.Close();

  // 2次元目をバラす
  nDblArray = nBuffer.Split("\n".ToCharArray());
  nTplArray = new string[nDblArray.Length][];

  // 3次元目をバラす
  for (i = 0; i < nDblArray.Length; i++) {
    nTplArray[i] = nDblArray[i].Split(",".ToCharArray());
  }

  // 中身を確認してみるテスト
  for (iRow = 0; iRow < nTplArray.Length; iRow++) {
    for (iCol = 0; iCol < nTplArray[iRow].Length; iCol++) {
      Console.WriteLine(nTplArray[iRow][iCol]);
    }
  }
}


ReadLine()メソッドで、1行取得して…
while (StreamReader.Peek() > -1) {
  // 配列を伸ばす
  // 「,」カンマでバラす
}

でも良かったのですが、配列を伸ばすのが面倒だし、
遅くなりそうな気もするので止めました。

VB.NETならもっと楽にできるでしょうね。
サンプル有難うございました。
参考にしてやってみます。
解決済み!

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