- ベストアンサー
VBScriptでCSVファイルを読み出したい
現在VBScriptでCSVファイルを1行ずつ読み取って、2次元配列に格納するプログラムを作成しています。 CSVファイルの中身は、サンプルで shop,price,sales 001,500,700 003,1200,90 024,,18 という並びになっています。 実データは300件くらいです。 1行目のヘッダーを読み飛ばし、2行目のデータから1行ずつ読取、","でsplitを用いてまず1次配列に格納しています。 1次元配列のarrLine(0)=001、(1)=500、(2)=700と入ったデータを 2次元配列arrshopに順次保存?したいのです。 ---------------------------------------------- dim strLine '1行ずつ読込んだデータを持つ dim ntLineNum '行数のカウント dim arrLine '","で区切った要素を持つ一次元配列 dim arrshop '一次元配列になった要素を2次元配列として格納 Do until .AtEndOfStream strLine = .ReadLine if 0<>strComp("",Trim(strLine)) then ntLineNum = intLineNum + 1 end if arrLine = split(strLine , ",") arrshop = Array(arrLines,i) i = i + 1 loop ----------------------------------------- msgbox arrshop(2)(0) と指定すると「003」出るようにしたいです。 Array関数が上手くないような気もします・・・。 どなたかご教授お願いします(>_<。)
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
Arrayのところがおかしいですね。 動くか検証してないですが… arrshop = Array(arrLines,i) の代わりに Redim Preserve arrshop(i+1) arrshop(i)=arrLines でやってみてください。 それと最初にiは0か1にでも初期化してから使う事をお勧めします。
その他の回答 (4)
- bkbkb
- ベストアンサー率33% (97/289)
遅くなりましたが 他にも素晴らしい回答が出てますが、まぁRedimでPreserveな方法で一行目を無視するのなら .ReadLine をdoループの前に適当に一回入れておくとか 行数増えて鬱陶しくなるけど if i = 1 then strLine = .ReadLine Else strLine = .ReadLine if 0<>strComp("",Trim(strLine)) then ntLineNum = intLineNum + 1 end if arrLine = split(strLine , ",") arrshop = Array(arrLines,i) end if みたいにして、1行目を無視させるとかすれば良いですよ。
お礼
bkbkbさま 続けての質問失礼いたしました。 またご丁寧にご回答いただきありがとうございました。 皆様のアドバイスで前に進めました。 本当にありがとうございました。
- fates
- ベストアンサー率0% (0/1)
arrshopが配列になってないじゃないか。 データ件数が300件と決まってるならならはじめに Dim arrshop(300) とすればいい。 格納するところでカウントしてるんだから arrshop(i) = Array(arrLines) なんだろうけどこの2つの修正でいけるとおもうが。。。 N数の配列であれば動的配列(+1づつ拡張)ReDim Preserveを使用するか。 そもそもReDimはVBSで重い処理だからやっちゃいけないことである。 アレイなんて使わずディクショナリーオブジェクト使えば一発だ。 Dim dic Dim i Dim line Set dic = CreateObject("Scripting.Dictionary") Do until .AtEndOfStream line = .ReadLine Call dic.Add(dic.Count, split(line, ",")) Loop '**** 1行目表示しないからiは1から始まる For i = 1 To dic.Count - 1 '**** スプリッドは必ず1つは存在するからこの表示は落ちない Call MsgBox(dic.Item(i)(0)) Next '**** 明示的なオブジェクト開放は必ず行え。ガーベジにたよるな dic.RemoveAll Set dic = Nothing 以上
補足
fatesさま ご指摘のとおりarrshopが配列になっていませんでした。 投稿後に気づいた次第です。 Dictionayオブジェクトのサンプルも出していただきありがとうございます。 Redimが重い処理というのも初めて知りました。 重ねて御礼申し上げます。
- A88No8
- ベストアンサー率52% (836/1606)
こんにちは >ヘッダー部分を飛ばしてCSVファイルを読込む方法 カウンタ変数 i か ntLineNumを利用して、最初の1行を捨てればよいのでは? >ntLineNum = intLineNum + 1 右辺の変数は、宣言がされていないのですがタイプミス?
補足
A88No8さま こんにちは。ありがとうございます。 変数iやLineNumではありませんが、1行目を捨てる事ができました。 ntLineNumは質問しましたところでは関係ないところでしたので 省かせていただきました。
- mindatg
- ベストアンサー率48% (110/227)
(0) (1) (2) 無視 shop,price,sales (0) 001,500,700 (1) 003,1200,90 >1行目のヘッダーを読み飛ばし、2行目のデータから1行ずつ読取 >msgbox arrshop(2)(0) と指定すると「003」出るようにしたいです。 サンプルの例でなら、「003」を出すには arrshop(1)(0)と指定しなきゃならないです。 その辺の確認をしっかりどうぞ
補足
あ"・・・ご指摘ありがとうございます!! ヘッダー部分を1行目と見てしまっていました(^△^;)
補足
bkbkbさま ありがとうございます! Redim Preserveで動作しました! また、iの初期化も忘れていました(^△^;) 質問にさらに質問で申し訳ないのですが・・・ ヘッダー部分を飛ばしてCSVファイルを読込む方法を 教えていただけないでしょうか・・・(T_T) 実行してみてわかったのですが、上記のソースでは ヘッダーも読込んでいました・・・