現在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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
VBSでカンマ区切り
Visual Basic(VBA)
-
VBScriptでcsvファイルの編集は出来ますか
Visual Basic(VBA)
-
VBSで指定行に挿入
その他(プログラミング・Web制作)
-
-
4
VBScriptにて、csvファイルから特定のレコードを取得したい
Visual Basic(VBA)
-
5
VBScript(vbs)での行の取得について
その他(プログラミング・Web制作)
-
6
VBS実行時エラー オブジェクトがありません 回避方法について
Visual Basic(VBA)
-
7
ステートメントの末尾が不正です
Windows Vista・XP
-
8
VBScriptで、ファイルから任意の行のみ取り出す方法について
その他(プログラミング・Web制作)
-
9
vbsでテキストファイル内の文字列検索
Visual Basic(VBA)
-
10
ReadLineでの読み出し行を指定する
Visual Basic(VBA)
-
11
VBSでエクセル内の行数を取得する方法
その他(プログラミング・Web制作)
-
12
VBscriptで「改行」と「」を置換させる"
その他(プログラミング・Web制作)
-
13
CSVファイルからダブルクォーテーションを削除したい。VBS使用で。
Word(ワード)
-
14
カンマ区切りのCSVファイルから"を削除したい
その他(プログラミング・Web制作)
-
15
VBSで変数の宣言はできないのですか?
Visual Basic(VBA)
-
16
VBSから別のVBS起動するとき変数を渡したい
Visual Basic(VBA)
-
17
VBSでテキストファイルのタブ区切りをカンマ区切り
その他(ソフトウェア)
-
18
VBSで応答不要のメッセージボックスを表示したい
その他(パソコン・スマホ・電化製品)
-
19
vbsのセル値の取得について
その他(プログラミング・Web制作)
-
20
VBSでソート&ファイル分割
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
エクセルでXY座標に並べられた...
-
Excel2010のinputboxで複数デー...
-
Dir関数で読み取り順を操作でき...
-
CheckBoxの配列化
-
大量の変数を定義するにはどう...
-
定数配列の書き方
-
構造体配列内の文字列検索のよ...
-
OutOfMemoryExceptionの回避策...
-
vba フィルター 複数条件 3つ以...
-
2次元配列でウォッチが出来ない
-
Redim とEraseの違いは?
-
グラフの「項目軸ラベルに使用...
-
VBAでMODE関数をつくる
-
excel vbaの配列なんですが・・・
-
サイズのわからない配列
-
C#でbyte配列から画像を表示さ...
-
エクセル VBA 変数を一括で宣言...
-
配列のペースト出力結果の書式...
-
デバイスマネージャーの一覧取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
Excel2010のinputboxで複数デー...
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
配列のペースト出力結果の書式...
-
Dir関数で読み取り順を操作でき...
-
エクセルでXY座標に並べられた...
-
VBAで配列引数を値渡しできない...
-
C++で作成したDLLにVBAから配列...
-
構造体配列の特定のメンバーをF...
-
OutOfMemoryExceptionの回避策...
-
大量の変数を定義するにはどう...
-
VBAでMODE関数をつくる
-
VBScriptでCSVファイルを読み出...
-
定数配列の書き方
-
Segmentation Fault (メモリ制限?)
-
Excelのメモリ(配列)の上限は2G...
-
Redim とEraseの違いは?
-
CheckBoxの配列化
-
配列の中の最大値とそのインデ...
おすすめ情報