- ベストアンサー
VB6.0 CSVファイル読み込みについて
VB6.0について質問です。 CSVファイルの読み込みを行いたいのですがうまくいきません。。。 以下のソースのどこに問題ありますでしょうか?>< 14個のカンマ区切りのCSVファイルを読み込んでいますが ファイルのデータを変更するとインデックスが有効範囲にありませんというエーラーがでます。。。 ファイルは3行で構成しているのですがヘルプを参照したら複数行の場合はLINE Input #1, MyString(i)と書いてありました。 しかしやってみると行ごとのデータを取得してカンマ区切りで取得してくれませんでした。。。 以下のソースで実行すると改行部でエラーになるようです。 改行を無視するようなロジックを入れる必要があるのでしょうか? Dim MyString(), i Open App.path & "\" & CSV_filename For Input As #1 ReDim MyString(13) Do While Not eof(1) Input #1, MyString(i) Label4(i).caption = MyString(i) i = i + 1 Loop Close #1
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
CSVファイルを列数は固定で、カンマで区切られていて複数行あるものとします。(一般的な概念) ●必ず列が5個(カンマが4個)の一行が複数行ある場合 Dim MyString() as String Dim i , j as Integer Open App.path & "\" & CSV_filename For Input As #1 Do until EOF(1) i = i + 1 ''行数を先に数えます Loop Redim MyString(i , 5) as String ''行数×列数分変数を初期化します for j = 1 to i Input #1, MyString(j,1),MyString(j,2),MyString(j,3),MyString(j,4),MyString(j,5) Next j Close #1 Debug.Print "2行目の3列目=" & MyString(2,3) ●必ず列が5個(カンマが4個)の3行一組が複数セットある場合 for j = 1 to i / 3 Input #1, MyString(j,1),MyString(j,2),MyString(j,3),MyString(j,4),MyString(j,5) Input #1, MyString(j,6),MyString(j,7),MyString(j,8),MyString(j,9),MyString(j,10) Input #1, MyString(j,11),MyString(j,12),MyString(j,13),MyString(j,14),MyString(j,15) Next j ★ご質問の中の問題点 1.「データを変更すると」 →列数は変更してはいけません(カンマの数は必ず同数) 2.「LintInput」 →Inputは行毎・列毎に値を取得します。LineInputは一行をひとつの値として値を取得します。 3.「ReDim MyString(13)」 →上記設定ですと変数は14個分ですが、カンマが14個ということは15個の変数が必要です 「Redim MyString(14)または(1 to 15)」となります 4.「Input #1, MyString(i)」 →列が15個あるのに一回のループで1個ずつしか値が取れません セル番号で表すと、 MyString(1) = "A1" MyString(2) = "B1" MyString(3) = "C1" となってしまいます。 つまり、行数に関わらず、14個までしか値の取得はできません。 長文にも関わらず的確でなくてすいません。 CSVファイルのイメージをご提示いただけるとサンプルソースが作りやすいと思います。 例)CSVファイルで列数は固定、行数は可変で各行の3番目の値を表示したい etc. A1,B1,C1,D1,E1 A2,B2,C2,D2,E2 A3,B3,C3,D3,E3 例)CSVファイルで列数は可変、行数は可変でn番目の値を表示したい etc. A1,B1,C1 A2,B2,C2,D2,E2 A3,B3,C3,D3
その他の回答 (4)
CSVファイルといっても何種類か存在します。 書式をお知らせください。 区切り文字が半角「,」か他の文字(「","」「#」)か 区切りの数が可変か固定か 改行コードは?。 現在でもPC-9801系CSVファイルが4系統, IF-800系CSVファイルが2系統, Windows系CSVファイルが2系統あり.私の使っているルーチンは以上の混用を前提に作られています。
- imogasi
- ベストアンサー率27% (4737/17069)
Line Input #1,a で改行コードまで読む。その文字列aに対し s=Split(a,",") For i=0 to Ubound(s) (処理) Next i レコードの終わりはEof(1)で判別し抜ける。
- otto0001otto
- ベストアンサー率25% (64/249)
MyStringも大きくして。
- otto0001otto
- ベストアンサー率25% (64/249)
aaa,bbb,ccc という行があったとしたら、 inputでは aaa bbb ccc とう順でよんでいきます。 Line Inputでは aaa,bbb,ccc と、カンマを含め1行を読み込みます。 Label4配列はいくつ切っていますか? Label4(i).caption = MyString(i) を取るとエラー出ないと思いますよ。