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

CSVを二次元配列に読み込ませる時の変数の宣言について

環境/言語:[環境/言語:[環境:Windows 7 使用言語:VB.NET Frameworkバージョン:4.0] ]
分類:[.NET]


CSVファイルを二次元配列に読み込ませるために以下のようなソースを書いた(いろんな掲示板からコピペしてきた)のですが、
**********************************************
Dim txtParser As Microsoft.VisualBasic.FileIO.TextFieldParser = _
New Microsoft.VisualBasic.FileIO.TextFieldParser( _
"c:\test.csv", _
System.Text.Encoding.GetEncoding("shift_jis"))
txtParser.TextFieldType = _
Microsoft.VisualBasic.FileIO.FieldType.Delimited
txtParser.SetDelimiters(",")
Dim SDat(20, 10) As String
Dim i As Integer = 0
Dim j As Integer = 0
While Not txtParser.EndOfData
Dim splittedResult As String() = txtParser.ReadFields()
For Each output As String In splittedResult
Console.WriteLine(Str(j) & ":" & Str(i) & ":" & output)
SDat(j, i) = output
i = i + 1
Next
i = 0
j = j + 1
End While
txtParser.Close()
**********************************************
SDAT(,)を宣言するときにtest.csvの行・桁数の最大数を取得するスマートな方法はあるでしょうか?
同じようなソースを2度書いて一度目でi,jの最大数を取って二度目にその数でSDATを宣言すればいいのは分かるのですが、同じCSVファイルを2度開くとか無いなあとも思っています・・・
2012/01/10(Tue) 22:40:13 編集(投稿者)
2012/01/10(Tue) 22:38:30 編集(投稿者)
2012/01/10(Tue) 22:37:05 編集(投稿者)

色々方法がありますが、下記ではどうでしょうか?

Dim SDat(,) As String = Nothing
Using sr As New System.IO.StreamReader("c:\test.csv", System.Text.Encoding.Default)
 Dim i, j As Integer
 Do Until sr.Peek() = -1
  Dim temp() As String
  temp = Split(sr.ReadLine(), ",")
  ReDim Preserve SDat(temp.GetUpperBound(0), i)
  For j = 0 To temp.GetUpperBound(0)
   SDat(j, i) = temp(j)
  Next
  i += 1
 Loop
End Using

For i = 0 To SDat.GetUpperBound(1)
 For j = 0 To SDat.GetUpperBound(0)
  Console.Write(SDat(j, i).ToString & "   ")
 Next
 Console.WriteLine()
Next
i,jの宣言がフォーカス外になってしまうようで動きませんでしたが、一行目に持っていくと動きました!
ありがとうございます、完璧に解決しました。
解決済み!

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