

現在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関数が上手くないような気もします・・・。
どなたかご教授お願いします(>_<。)
No.2ベストアンサー
- 回答日時:
Arrayのところがおかしいですね。
動くか検証してないですが…
arrshop = Array(arrLines,i)
の代わりに
Redim Preserve arrshop(i+1)
arrshop(i)=arrLines
でやってみてください。
それと最初にiは0か1にでも初期化してから使う事をお勧めします。
この回答への補足
bkbkbさま
ありがとうございます!
Redim Preserveで動作しました!
また、iの初期化も忘れていました(^△^;)
質問にさらに質問で申し訳ないのですが・・・
ヘッダー部分を飛ばしてCSVファイルを読込む方法を
教えていただけないでしょうか・・・(T_T)
実行してみてわかったのですが、上記のソースでは
ヘッダーも読込んでいました・・・
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行目を無視させるとかすれば良いですよ。
bkbkbさま
続けての質問失礼いたしました。
またご丁寧にご回答いただきありがとうございました。
皆様のアドバイスで前に進めました。
本当にありがとうございました。
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
以上
この回答への補足
fatesさま
ご指摘のとおりarrshopが配列になっていませんでした。
投稿後に気づいた次第です。
Dictionayオブジェクトのサンプルも出していただきありがとうございます。
Redimが重い処理というのも初めて知りました。
重ねて御礼申し上げます。
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)と指定しなきゃならないです。
その辺の確認をしっかりどうぞ
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列のペースト出力結果の書式...
-
VBA 変数名に変数を使用したい。
-
エクセルの列一括書き込み
-
COBOLの基本的な事なので...
-
VB.NETの配列にExcelから読み込...
-
VBAでMODE関数をつくる
-
C#でbyte配列から画像を表示さ...
-
画像ファイルを配列に格納する方法
-
EXCELを使って、アクセスログを...
-
Imagelist の使い回しについて
-
VBAで配列引数を値渡しできない...
-
C#,繰り返し処理での最大値の取...
-
エクセル VBA 変数を一括で宣言...
-
C# DataTableに最後に追加した...
-
VBAコンボボックスの内容が反映...
-
他のMDBのテーブルに追加したい
-
『列名 '担当者CD' があいま...
-
vb6のコンボボックスの操作につ...
-
アクセスでウェブ上のデータを...
-
エクセルのセル最終行取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
エクセルでXY座標に並べられた...
-
Dir関数で読み取り順を操作でき...
-
vba フィルター 複数条件 3つ以...
-
配列のペースト出力結果の書式...
-
複数のtextboxの処理を一括で行...
-
Excelのメモリ(配列)の上限は2G...
-
配列の中の最大値とそのインデ...
-
大量の変数を定義するにはどう...
-
Excel2010のinputboxで複数デー...
-
COBOLの基本的な事なので...
-
構造体配列内の文字列検索のよ...
-
VBAでMODE関数をつくる
-
Redim とEraseの違いは?
-
VBScriptでCSVファイルを読み出...
-
VB6のメモリ解放に関して
-
VB.NETの配列にExcelから読み込...
-
Segmentation Fault (メモリ制限?)
-
ActiveReports(アクティブレポ...
おすすめ情報