VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 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を使う事にしました。

ありがとうございました。


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -