• ベストアンサー

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関数が上手くないような気もします・・・。 どなたかご教授お願いします(>_<。)

質問者が選んだベストアンサー

  • ベストアンサー
  • bkbkb
  • ベストアンサー率33% (97/289)
回答No.2

Arrayのところがおかしいですね。 動くか検証してないですが… arrshop = Array(arrLines,i) の代わりに Redim Preserve arrshop(i+1) arrshop(i)=arrLines でやってみてください。 それと最初にiは0か1にでも初期化してから使う事をお勧めします。

noname#133567
質問者

補足

bkbkbさま ありがとうございます! Redim Preserveで動作しました! また、iの初期化も忘れていました(^△^;) 質問にさらに質問で申し訳ないのですが・・・ ヘッダー部分を飛ばしてCSVファイルを読込む方法を 教えていただけないでしょうか・・・(T_T) 実行してみてわかったのですが、上記のソースでは ヘッダーも読込んでいました・・・

その他の回答 (4)

  • bkbkb
  • ベストアンサー率33% (97/289)
回答No.5

遅くなりましたが 他にも素晴らしい回答が出てますが、まぁ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行目を無視させるとかすれば良いですよ。

noname#133567
質問者

お礼

bkbkbさま 続けての質問失礼いたしました。 またご丁寧にご回答いただきありがとうございました。 皆様のアドバイスで前に進めました。 本当にありがとうございました。

  • fates
  • ベストアンサー率0% (0/1)
回答No.4

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 以上

noname#133567
質問者

補足

fatesさま ご指摘のとおりarrshopが配列になっていませんでした。 投稿後に気づいた次第です。 Dictionayオブジェクトのサンプルも出していただきありがとうございます。 Redimが重い処理というのも初めて知りました。 重ねて御礼申し上げます。

  • A88No8
  • ベストアンサー率52% (836/1606)
回答No.3

こんにちは >ヘッダー部分を飛ばしてCSVファイルを読込む方法 カウンタ変数 i か ntLineNumを利用して、最初の1行を捨てればよいのでは? >ntLineNum = intLineNum + 1 右辺の変数は、宣言がされていないのですがタイプミス?

noname#133567
質問者

補足

A88No8さま こんにちは。ありがとうございます。 変数iやLineNumではありませんが、1行目を捨てる事ができました。 ntLineNumは質問しましたところでは関係ないところでしたので 省かせていただきました。

  • mindatg
  • ベストアンサー率48% (110/227)
回答No.1

   (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)と指定しなきゃならないです。 その辺の確認をしっかりどうぞ

noname#133567
質問者

補足

あ"・・・ご指摘ありがとうございます!! ヘッダー部分を1行目と見てしまっていました(^△^;)

関連するQ&A