CSV ダブルコーテーション

解決


mari  2007-05-29 03:52:40  No: 136547

あるCSVデータを  VBで読み込んで変数に格納してましたところ、
奇妙なことが起こりました。

最初のデータは
""1234567""  で  次のデータは  "1234"  なのです。
最初の変数はLongが望ましいので、  CLngで変換してもエラーが発生します。そのままStringの変数に入れると「"1234567"」になってしまいます。

いろいろ駆使して、やってみましたが、どーーも最初の文字だけダブルコーテーションなのです。

Clngではなくてどのようにすればいいのでしょうか?


ささき  2007-05-29 04:19:14  No: 136548

>""1234567""  で  次のデータは  "1234"  なのです。

これは実際のデータ(CSVファイル)の中身がそうなっているでなければ、
変数に格納する時に、そうゆう処理してませんか?
という解答しかできないと思いますが・・・。

CSVファイルの中身をテキストファイルで開くとどうなっていますか?


  2007-05-29 19:27:29  No: 136549

Clngをする前にReplaceでダブルクォーツを取り外すのではどうでしょ?


お勧めしない  2007-05-29 19:39:50  No: 136550

>Clngをする前にReplaceでダブルクォーツを取り外すのではどうでしょ?

全てのデータがLongならばそうゆうこともできるけれども、
CSVデータとしてダブルクオートが入る場合もあるので、あまりやりたくないなぁ〜。

それより質問者は、
ささき さんが言うように、
ファイルを読込む前の状態にそういったデータが含まれるのか
それとも、
データにはダブルクオートが含まれていないのに格納される変数にだけ
なぜかダブルクオートが含まれるのか?
の解答をしたほうが有力情報だと思うけれど・・・。


  2007-05-29 20:08:21  No: 136551

>Clngではなくてどのようにすればいいのでしょうか?
を簡単に行う場合がReplaceです・・・

根本を解決するのであればささき氏・お勧めしない氏両名が言うように
CSVファイルの中身を確認し、
「"1234567",1234」であれば、CSVファイルが問題
「1234567,1234」であれば、読込み時に何かあると考えるべきだと思います。

読み込む時に単純にStreamReaderで読み込んでいるのか、
会社であれば独自のフォーマット変更ファンクションとか通していませんか?


ささき  2007-05-29 20:16:18  No: 136552

CSVって
・区切りはカンマである。 
・データにカンマを含む場合はダブルクオートで囲う。 
・ダブルクオートで囲ったデータ中のダブルクオートはダブルクオート2回で置き換える。

CSVのデータの中身ひょっとして、
"1234567,1234"
とかなっていない?


ささき  2007-05-29 20:18:04  No: 136553

わかりづらいので
初 サンの記述で投稿

「"1234567,1234"」
とかなっていない?


mari  2007-05-29 20:30:53  No: 136554

エディタで開くと
"売上ID","配送先ID"←(CRLFではない)
"1234567","1234"・・・

NOTEPADだと改行入ってないので
"売上ID","配送先ID","1234567","1234"・・・

このCSVデータはあるWebショップ受注のダウンロードデータです。

頭に""となってないので、
>「"1234567,1234"」
ってわけではなさそうなのですが、
VBで
   '■テキストファイルをオープン
    Open FileName For Input As #intFileNo
        '■ファイルの終端までループを繰り返します。
        Do While Not EOF(intFileNo)
            '■1 行づつ変数に読み込みます。
            Input #intFileN   str売上ID, str配送先ID,・・・

ってやると  ツールチップにどーやら  ""1234567"  ってなってるっぽいです。

このInputの方法が悪いのかなと。。。

もーちょっとやってみまして、また質問が出てくるかもしれません。
その時はよろしくお願いします。


  2007-05-29 20:33:18  No: 136555

別プログラムでCSVを吐き出し
mori氏のプログラムで読込む場合

別プログラムが

strWord = """""1234567"""",1234"

とかを吐いてる可能性も?


  2007-05-29 20:43:56  No: 136556

>"売上ID","配送先ID"←(CRLFではない)
>"1234567","1234"・・・
>
>NOTEPADだと改行入ってないので
>"売上ID","配送先ID","1234567","1234"・・・

NotePadで開いた時に

"売上ID","配送先ID""1234567","1234"・・・

                  ↑このようにならないんですか?

配達先IDと3つ目の値が1つの文字列とみなされてませんか?


ささき  2007-05-29 20:45:23  No: 136557

> "売上ID","配送先ID"←(CRLFではない)
> "1234567","1234"・・・

のデータは、mori氏が想定しているCSVの形式であれば問題ないけれど
スルーしているので、きっと問題は無いのでしょう。

何個か追加で質問
・"1234567","1234"・・・の後の改行コードは(CRLF?)
・また複数件のデータの時は
"売上ID","配送先ID"←(CRLFではない)
"1234567","1234"・・・
"売上ID","配送先ID"←(CRLFではない)
"1234567","5678"・・・
っと、売上IDや配送先IDの列も1件に対し、1件入っているイメージ?
それとも最初だけ?
"売上ID","配送先ID"←(CRLFではない)
"1234567","1234"・・・
"1234567","5678"・・・


ささき  2007-05-29 21:04:58  No: 136558

>配達先IDと3つ目の値が1つの文字列とみなされてませんか?

Inputされた値の分解で、
ヘッダ行("売上ID","配送先ID"・・・)と
データ行("1234567","1234"・・・)を
うまく切り離されていないのではないかな?

>"売上ID","配送先ID"←(CRLFではない)
の改行コードがわかれば・・・。


mari  2007-05-29 21:06:25  No: 136559

>"売上ID","配送先ID""1234567","1234"・・・

                  ↑このようにならないんですか?

すみません、なりました。

CRLFではなく「0a」だということがわかりました。

>それとも最初だけ?
最初だけ  売上IDとかヘッダがつきます。


mari  2007-05-29 21:38:52  No: 136560

えっと、、、
この場合  どのようにして読むのが一番いいのでしょうか?

バイナリーで読むのでしょうか?

ちょっとやってみます。。。


mari  2007-05-29 21:59:54  No: 136561

できました。

Replace!使えましたっ!
バイナリで読み込まなくてもよさそうです。

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


  2007-05-29 23:00:35  No: 136562

解決おめでとうございます。

個人的に最善と思うのは上位の排出ロジックを変更してもらい、

"売上ID","配送先ID"(CRLF)
"1234567","1234"(CRLF)
"2345678","1234"(CRLF)
・・・
と排出してもらう。

読込みループ中に
Dim intNum As Integer  ←変数名適当
intNum = 0

Do While Not・・・
    If intNum = 0 Then
        ヘッダー変数代入
    Else
        データ行代入
    End If
    intNum = intNum + 1
Loop

変数代入の時にString→Long変換ファンクションを作成し、
ファンクションの中でエラーや変換に不要なものを整理する
(Replaceや数値チェック)

が、個人的にお勧め。
この辺りは十人十色。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加