[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/06/27(Wed) 10:12
投稿者名:はな
Eメール:
URL :
タイトル:
データに二重引用符が含まれているcsvファイルの読み込み方
csvファイルを読み込む処理をしています。
読み込むcsvファイルは以下のようになっていて、文字列は二重引用符で囲まれ、数字は囲まれていません。

"001","山田健         ",  300.00,"社員      "
"002","佐藤"ボブ"隆   ",  500.00,"留学生    "

このようファイルをInput #で読み込むと、
3行目の「佐藤"ボブ"隆」のところで、データが分かれてしまいます。

Input #intFileNo, strTest1, strTest2, strTest3, strTest4

1行目の読み込み結果(OK)
strTest1 → 001
strTest2 → 山田健
strTest3 → 300.00
strTest4 → 社員

2行目の読み込み結果(NG)
strTest1 → 002
strTest2 → 佐藤
strTest3 → ボブ"隆   "   ← 変数の中に二重引用符が2つ入ってくる
strTest4 → 500.00

データそのものに二重引用符が含まれている場合、みなさんはどうやって解決しているのですか?

投稿時間:2007/06/27(Wed) 10:24
投稿者名:ダンボ
Eメール:
URL :
タイトル:
Re: データに二重引用符が含まれているcsvファイルの読み込み方
こんにちは。

> データそのものに二重引用符が含まれている場合、みなさんはどうやって解決しているのですか?

そんなCSVを認めてしまったことに問題があると思いますが、できてしまったものはどうするか。
私だったらプリプロセスですね。(プリプロセッサを作ってデータ変換)
幸い桁数が固定な様なので、処理は容易いかと。(Excelの固定幅読み込みでもなんとかなる)

投稿時間:2007/06/27(Wed) 11:36
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: データに二重引用符が含まれているcsvファイルの読み込み方
> データそのものに二重引用符が含まれている場合、みなさんはどうやって解決しているのですか?

私なら、質問する前に サイト内検索で[CSV 引用符]で検索します。

すごいのが見つかります。

投稿時間:2007/06/27(Wed) 14:30
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^2: データに二重引用符が含まれているcsvファイルの読み込み方
今回のような問題なら下記でもOKかと。

Private Sub Command1_Click()
   Dim AddDat   As Variant
   Dim myString As String
   Dim i        As Long
   myString = """002""" & "," & """佐藤""ボブ""隆   """ & _
                                    "," & "500.00" & "," & """留学生    """
   Debug.Print myString

   AddDat = Split(myString, ",")
   For i = LBound(AddDat) To UBound(AddDat)
      If Left$(AddDat(i), 1) = Chr(34) And Right$(AddDat(i), 1) = Chr(34) Then
         AddDat(i) = Mid$(AddDat(i), 2, Len(AddDat(i)) - 2)
      End If
      Debug.Print AddDat(i)
   Next i
End S

投稿時間:2007/06/27(Wed) 12:10
投稿者名:nobu
Eメール:
URL :
タイトル:
Re: データに二重引用符が含まれているcsvファイルの読み込み方
> データそのものに二重引用符が含まれている場合、みなさんはどうやって解決しているのですか?

私は以前に下記の中にある Function chrParamArrayEx() を入手していたので
CSV読み込みで問題がある時には使っています。
但しファイルサイズが大きいCSVですと読み込み処理に
時間がかかります。
下記から必要部分を上手く抜き出せれば使える思います。

chrParamArrayEx でWeb検索しても下記以外には出て来ませんね。


http://jstore.jst.go.jp/cgi-bin/patent/advanced/pat/detail_pat.cgi?patid=4680&detail_id=4953

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

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

投稿時間:2007/06/27(Wed) 15:52
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^2: データに二重引用符が含まれているcsvファイルの読み込み方
> ・Input #ステートメントは二重引用符が混ざったデータをカンマで
>   区切って取得できないから、正しいcsv形式の時にだけ使う

そもそも Input # は、CSV ファイル用のステートメントではありませんしね。
本来は、Write # ステートメントと組み合わせて使うものです。
(Boolean 型や Date 型のデータを Write # してみると、CSV との違いが分かるかも)

投稿時間:2007/06/27(Wed) 21:15
投稿者名:
Eメール:
URL :
タイトル:
Re^2: データに二重引用符が含まれているcsvファイルの読み込み方
> (お礼と解決策をスレッドのどの部分に書くと、同じ問題で悩んでいる人の
> ためになるのか良くわからなくて、自分で書いた記事に返信しました。)

とか言ってるけど、質問する前に調べろよ?