こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBSでCSVのキー項目の取得

VBSでCSVファイル(UnicodeBE BOMなし)内のデータを
キー項目(コード)ごとに分け、
それぞれ別のCSVファイルに出力しようとしています。
(ファイル名にコードを付与することで別々にします。)
しかし、キー項目の取得に失敗しているようで
分岐処理が正しく行われていません。

CSVファイル(test_in.csv)は以下のような形式です。
(実際のファイルに項目行はありません)
連番,コード,フラグ,日付
1,0001,A,20091001
2,0002,A,20091001
3,0002,U,20091002
4,0001,D,20091003

以前、こちらで質問し、ご回答頂いた内容を基に
処理を実装しました。

Option Explicit

Dim iSt
Dim tPath
Dim oFso
Dim stdOut
Dim aLine
Dim field
Dim wk

Set iSt = WScript.CreateObject("ADODB.Stream")
iSt.Open
iSt.Type = 2 'バイナリ
iSt.Charset = "UTF-16BE"
iSt.LoadFromFile("test_in.csv")
iSt.LineSeparator = -1 'CRLF
iSt.Position = 0
tPath = "E:\\test_out.csv"
Set oFso = CreateObject("Scripting.FileSystemObject")
Set stdOut = CreateTextFileBE(oFso,tPath)

Do While Not iSt.EOS
aLine = iSt.ReadText(-1)
field = split(aLine,",")
aLine = join(field,",")
if field(1) = "0002" then
WriteLine stdOut,aLine
end if
Loop
iSt.Close
oFso.Close
Set iSt = Nothing
Set oFso = Nothing
WScript.Quit

Function CreateTextFileBE(fso,Path)
fso.CreateTextFile(Path).Write Chr(&HFE) & Chr(&HFF)
Set CreateTextFileBE=fso.OpenTextFile(Path,8,,True)
End Function

Sub WriteLine(stdOut,Line)
stdOut.Write Line & vbCrLf
End Sub

0002のレコードが入ったCSVファイルを出力しようとしましたが、
レコードなしのCSVファイルが作成されてしまいます。
コードごとにファイルを分ける処理についてもよくわからず、
取りあえずコードを限定し1ファイルだけの出力にしています。

投稿日時 - 2009-11-02 18:34:33

QNo.5416847

困ってます

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

>Do While Not iSt.EOS
>aLine = iSt.ReadText(-1)
・・・
>Loop

何回ループしていますか?
ReadTextの引数を見ると、一遍に読み込んでいるようですが。
http://msdn.microsoft.com/ja-jp/library/cc389881.aspx

投稿日時 - 2009-11-03 18:33:42

補足

ご回答ありがとうございます。
ご指摘のとおり、一度に全て読み込んでいました。
iSt.ReadText(-2)に修正し、一行ずつ読み込むようにしました。

投稿日時 - 2009-11-04 21:48:42

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

>iSt.ReadText(-2)に修正し、一行ずつ読み込むようにしました。

で、問題は未解決のままですか?
今度はどういう問題があるのですか?

投稿日時 - 2009-11-05 22:41:29

お礼

ご回答ありがとうございます。
1ファイル出力については正常終了しましたので
この質問は締め切らせて頂きます。

投稿日時 - 2009-11-06 09:47:04

ANo.1

> if field(1) = "0002" then

if field(0) = "0002" then
ではありませんか?

投稿日時 - 2009-11-02 19:19:53

お礼

ご回答ありがとうございます。
先頭の「連番」ではなく、二つめの「コード」で判定をします。
ですので配列の添字は0から始まるので
二つめを表すfield(1)であっていると思います。

投稿日時 - 2009-11-04 21:46:39

あなたにオススメの質問