アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (5件)

Arrayのところがおかしいですね。



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

この回答への補足

bkbkbさま
ありがとうございます!
Redim Preserveで動作しました!
また、iの初期化も忘れていました(^△^;)

質問にさらに質問で申し訳ないのですが・・・
ヘッダー部分を飛ばしてCSVファイルを読込む方法を
教えていただけないでしょうか・・・(T_T)
実行してみてわかったのですが、上記のソースでは
ヘッダーも読込んでいました・・・

補足日時:2009/03/05 15:34
    • good
    • 2

遅くなりましたが



他にも素晴らしい回答が出てますが、まぁ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行目を無視させるとかすれば良いですよ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/09 17:08

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が重い処理というのも初めて知りました。
重ねて御礼申し上げます。

補足日時:2009/03/09 17:00
    • good
    • 1

こんにちは


>ヘッダー部分を飛ばしてCSVファイルを読込む方法
カウンタ変数 i か ntLineNumを利用して、最初の1行を捨てればよいのでは?

>ntLineNum = intLineNum + 1
右辺の変数は、宣言がされていないのですがタイプミス?

この回答への補足

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

補足日時:2009/03/09 16:56
    • good
    • 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)と指定しなきゃならないです。
その辺の確認をしっかりどうぞ

この回答への補足

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

補足日時:2009/03/05 15:31
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A