CSVを VBScript でちょっと加工したい時に、split(",", hoge ) とついやりたくなるが、
項目中に 「,」があると意外にやっかいである。たとえばこんなケース。。
<やっかいなCSVの例>
A, B, "C,D,E" , F
これをフツーに Split すると「A」、「B」、「"C」、「D」、「E"」
などと分割されてしまう。
てなわけで、「A」、「B」、「C,D,E」となるようにスクリプトを書いてみた。
実際にやってみると、文字コードやら、途中に2バイト文字があった場合やら、
これまた意外に面倒なことが分かったので、下記のようなベタなコードにした。
ということで、メモ代わりに貼っておきます。
好きに使ってね。。
なんのことはない、最初に文字列を調べて、" と "の間だけ区切り文字を別のもの( {} など)に
置き換えているだけです。。文字コードが UTF-8 やら unicode やらがきても対応できるよう、
テキストの読み込みにはストリームオブジェクトを使いました。これってとっても便利!
---------------------------------------------------------------------------
Const strInFile = "test.txt"
Dim intLc, intFlg, intDummy, chrC, strOutBuf, strWriteBuf
Dim ArrWriteBuf
Dim objInFile
Set objInFile = CreateObject("ADODB.Stream")
With objInFile
.Type = 2
.Charset = "unicode"
.Open
.LoadFromFile = strInFile
End With
Dim strLine
Do until objInFile.EOS
strLine = objInFile.ReadText(-2)
intFlg = 0
strOutBuf = ""
For intLc = 1 to Len(strLine)
chrC = Mid(strLine, intLc, 1)
If intFlg = 1 Then
Select Case chrC
Case """"
intFlg = 0
strOutBuf = strOutBuf & chrC
Case ","
strOutBuf = strOutBuf & "{}"
Case Else
strOutBuf = strOutBuf & chrC
End Select
Else
Select Case ChrC
Case """"
intFlg = 1
strOutBuf = strOutBuf & chrC
Case Else
strOutBuf = strOutBuf & chrC
End Select
End If
Next
WScript.Echo strOutBuf
ArrWriteBuf = Split(strOutBuf,",")
strWriteBuf = Replace( ArrWriteBuf(0), "{}", "," )
For intLc = 1 to Ubound(ArrWriteBuf)
strWriteBuf = strWriteBuf & "," & Replace( ArrWriteBuf(intLc), "{}", "," )
Next
WScript.Echo strWriteBuf
Loop
objInFile.Close
Set objInFile = Nothing
※コメント投稿者のブログIDはブログ作成者のみに通知されます