投稿日 | : 2007/06/27(Wed) 15:33 |
投稿者 | : はな |
Eメール | : |
URL | : |
タイトル | : Re: データに二重引用符が含まれているcsvファイルの読み込み方 |
(お礼と解決策をスレッドのどの部分に書くと、同じ問題で悩んでいる人の
ためになるのか良くわからなくて、自分で書いた記事に返信しました。)
ダンボさん、花ちゃん、nobuさん、どうもありがとうございます。
みなさんの返信と過去記事を読んで
・Input #ステートメントは二重引用符が混ざったデータをカンマで
区切って取得できないから、正しいcsv形式の時にだけ使う
・Split関数を使えば、指定した区切り文字で1次元の配列が簡単に作れる
・データに二重引用符やカンマが混ざっている場合([,"佐藤"ボブ"隆 ",]や
[,"山田花子,太郎",])は、文字をひとつずつ検査しなくてはいけない
という事なのかな?と思いました。
csv形式なのに [,"佐藤"ボブ"隆 ",] というデータが入っている状態なので、
もしかしたらカンマも入ってくるかも知れないと考えて、過去記事のNo.1982
に載っていた fSplit2 というプロシージャとSplit関数と、両方を使う事にし
ました。
過去記事のURL
http://hanatyan.sakura.ne.jp/vbdengon/log_1951to2000.htm
それで結局、
Do While Not objText.AtEndOfStream
'1行ごっそり読んで
strLine = Trim(objText.ReadLine)
'Split関数でバリアント型の変数の配列に入れて
aryAddDat = Split(strLine, ",")
'要素が85個を超えていたら(今回の項目は85個と決まっているので)、
'過去記事に載っていた fSplit2 に区切りなおしてもらう(記事No.1982を参照)
If UBound(aryAddDat) > 84 Then
aryAddDat = fSplit2(strLine)
End If
'無事に配列に収まったら、前後の二重引用符を削る。(記事No.9454を参照)
For i = LBound(aryAddDat) To UBound(aryAddDat)
If Left$(aryAddDat(i), 1) = Chr(34) And Right$(aryAddDat(i), 1) = Chr(34) Then
aryAddDat(i) = Mid$(aryAddDat(i), 2, Len(aryAddDat(i)) - 2)
End If
Next i
・・・と、このような感じになりました。
Split関数を使わずに全て fSplit2 で区切ってしまえば良いのかと考えたのです
が、実行する時に通過する行が少ない方が速く動くのかなぁ?と思い、配列要素の
数が多い時だけ、fSplit2を使う事にしました。
ありがとうございました。