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

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

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

Re[6]: csvファイルを配列に読み込み


(過去ログ 114 を表示中)

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

■67661 / inTopicNo.1)  csvファイルを配列に読み込み
  
□投稿者/ ともちゃん (1回)-(2013/08/22(Thu) 13:47:15)

分類:[VB.NET/VB2005 以降] 


csvファイルを配列に読み込もうとしています。
csv_data(lin_n, i) = csv_data1(i)
でエラーします。

Public csv_data(10,10) As String 'csvデータ
とでも最初にサイズを指定すればOKなのですが、指定せずに可能でしょうか?


Module M_main
Public csv_data(,) As String 'csvデータ

Sub main_p()
Dim lin_n As Double 'csvファイル行数
Dim csv_data1() As String 'csvデータ csv1行用
Dim stBuffer As String
Dim i As Integer
' StreamReader の新しいインスタンスを生成する
Dim cReader As New System.IO.StreamReader(Application.StartupPath & "\p_name.csv", System.Text.Encoding.Default)
While (cReader.Peek() >= 0) ' 読み込みできる文字がなくなるまで繰り返す
' ファイルを 1 行ずつ読み込む
stBuffer = cReader.ReadLine()
csv_data1 = stBuffer.Split(","c) ' カンマ区切りで分割して配列に格納する
For i = 0 To UBound(csv_data1)
csv_data(lin_n, i) = csv_data1(i)
Next i
lin_n = lin_n + 1 'csvファイル行数
End While
cReader.Close()
End Sub
End Module
引用返信 編集キー/
■67662 / inTopicNo.2)  Re[1]: csvファイルを配列に読み込み
□投稿者/ Hongliang (85回)-(2013/08/22(Thu) 13:57:06)
List(Of String())を使うようにするとか。

Dim csv_data As New List(Of String())

csv_data1 = stBuffer.Split(","c) ' カンマ区切りで分割して配列に格納する
csv_data.Add(csv_data1)

引用返信 編集キー/
■67664 / inTopicNo.3)  Re[2]: csvファイルを配列に読み込み
□投稿者/ ともちゃん (2回)-(2013/08/22(Thu) 17:05:43)
No67662 (Hongliang さん) に返信
ご回答有り難う御座いました。
出来た配列の確認をしたいのですが、わかりません。
Sub read_csv_chk()
で確認をしようとしてますが、UBound(csv_data(1)) が適当に入れてエラーしなかったので。
csv_data(i, j)がエラーでこうではないですね。
自分なりにしらべてみましたがわかりませんでした。
済みませんが教えて下さい。

Module M_main
Public csv_data As New List(Of String())
Sub main_p()
Dim lin_n As Double 'csvファイル行数
Dim csv_data1() As String 'csvデータ csv1行用
Dim stBuffer As String
Dim i As Integer
' StreamReader の新しいインスタンスを生成する
Dim cReader As New System.IO.StreamReader(Application.StartupPath & "\p_name.csv", System.Text.Encoding.Default)
While (cReader.Peek() >= 0) ' 読み込みできる文字がなくなるまで繰り返す
' ファイルを 1 行ずつ読み込む
stBuffer = cReader.ReadLine()
csv_data1 = stBuffer.Split(","c) ' カンマ区切りで分割して配列に格納する
For i = 0 To UBound(csv_data1)
'csv_data(lin_n, i) = csv_data1(i)
csv_data.Add(csv_data1)
Next i
lin_n = lin_n + 1 'csvファイル行数
End While
cReader.Close()
read_csv_chk() '出来た配列データを確認
End Sub


Sub read_csv_chk() '出来た配列データを確認
Dim i As Double
Dim j As Double
For i = 0 To UBound(csv_data(1)) '1とすると、配列の前側のmaxを調べる
For j = 0 To UBound(csv_data(2)) '1とすると、配列の後ろ側のmaxを調べる
MsgBox(csv_data(i, j))
Next j
Next i
End Sub
End Module
引用返信 編集キー/
■67665 / inTopicNo.4)  Re[3]: csvファイルを配列に読み込み
□投稿者/ Hongliang (86回)-(2013/08/22(Thu) 17:34:42)
> csv_data1 = stBuffer.Split(","c) ' カンマ区切りで分割して配列に格納する
> For i = 0 To UBound(csv_data1)
>     'csv_data(lin_n, i) = csv_data1(i)
>     csv_data.Add(csv_data1)
> Next i

csv_dataは行そのものを要素として格納します。
セル毎にAddしていったら大変なことになります。
行毎に一回だけAddすれば十分です。

> Dim i As Double
> Dim j As Double

整数しか格納しないループ変数なのになぜDoubleなんでしょう?

> For i = 0 To UBound(csv_data(1)) '1とすると、配列の前側のmaxを調べる

csv_dataはList(Of String())クラスのインスタンスです。
これは大体配列と同様に使えますが、使える関数やメソッドにはいくらか差異があります。
(まず、配列を対象とするVB関数は使用できません)
要素数を取得するにはSizeプロパティを使用します。

For i = 0 To csv_data.Size - 1 ' 例えば4要素入っていると、0〜3にアクセスする必要が
                               ' あるので-1しないといけない
    Dim row As String() = csv_data(i) ' 要素の取得は配列と同じ

あるいは、「リストの全てを列挙する」ステートメントFor Eachを使用できます。

For Each row As String() In csv_data

> For j = 0 To UBound(csv_data(2)) '1とすると、配列の後ろ側のmaxを調べる

上記のいずれかのようにしてrow As String()を取ってくれば、
あとは行を配列としてアクセスできるようになります。

For j = 0 To row.Length - 1 ' VB関数UBoundを使わないならこう
    Trace.Print(row(j).ToString()) ' メッセージボックスの代わりに
Next

配列でもFor Eachを使えます。
For Each cell As String In row
    Trace.Print(cell.ToString())
Next

ここでは一旦row As String()を用意しましたが、直接アクセスするならこんな記述になります。

For j = 0 To csv_data(i).Length - 1
    Trace.Print(csv_data(i)(j).ToString())
Next

引用返信 編集キー/
■67674 / inTopicNo.5)  Re[4]: csvファイルを配列に読み込み
□投稿者/ ともちゃん (3回)-(2013/08/23(Fri) 08:43:08)
No67665 (Hongliang さん) に返信
いちから教えて頂き大変感謝致します。ほんとに基本分かってないないでお手数をおかけします。
一応以下で希望通りになりました。

一点動作は同じだと思いますが、
For i = 0 To lin_n - 1
のところで、lin_nを使用しなくても、csv_data.Sizeで取得出来るのではないかと思いますが、
メンバではありませんのエラーが出力されます。
Public csv_data As New List(Of String())の定義をすれば、このエラーは出ないと思ってますが
違うのでしょうか。

Public csv_data As New List(Of String())
Sub main_p()
Dim csv_data1() As String 'csvデータ csv1行用
Dim stBuffer As String
Dim lin_n As Integer 'csvファイル行数
Dim cReader As New System.IO.StreamReader(Application.StartupPath & "\p_name.csv", System.Text.Encoding.Default)
While (cReader.Peek() >= 0) ' 読み込みできる文字がなくなるまで繰り返す
stBuffer = cReader.ReadLine() ' ファイルを 1 行ずつ読み込む
csv_data1 = stBuffer.Split(","c) ' カンマ区切りで分割して配列に格納する
csv_data.Add(csv_data1)
lin_n = lin_n + 1
End While
cReader.Close()

'csv_data.Size

'出来た配列データを確認
Dim i As Integer
Dim j As Integer
For i = 0 To lin_n - 1
For j = 0 To csv_data(i).Length - 1
Debug.Write(csv_data(i)(j).ToString() & " , ")
Next
Debug.WriteLine("")
Next
End Sub
解決済み
引用返信 編集キー/
■67676 / inTopicNo.6)  Re[5]: csvファイルを配列に読み込み
□投稿者/ Hongliang (87回)-(2013/08/23(Fri) 09:25:07)
> のところで、lin_nを使用しなくても、csv_data.Sizeで取得出来るのではないかと思いますが、
> メンバではありませんのエラーが出力されます。
> Public csv_data As New List(Of String())の定義をすれば、このエラーは出ないと思ってますが
> 違うのでしょうか。

なんか違うなーと思ってたら、SizeじゃなくてCountでした。
混乱させてしまってすいません。
// なんでこんな勘違いしたんだろう……。
引用返信 編集キー/
■67678 / inTopicNo.7)  Re[6]: csvファイルを配列に読み込み
□投稿者/ ともちゃん (4回)-(2013/08/23(Fri) 09:48:52)
No67676 (Hongliang さん) に返信
ご回答大変有り難う御座いました。
元のコードとは別物ですっきりしました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -