- ベストアンサー
データにカンマが入ったCSVデータのread方法
VBにてCSVデータを読み込むロジックを組んでいるのですが データの中にカンマが入ったものがたまにあります。 通常通り読むとデータのカンマを区切りのカンマと間違え正しく変数に読み込まれません。 たとえばCSVデータが下記の場合 123,de-ta,12,000,jjjj 実際のデータは 123 de-ta 12,000 jjjj ですが 12,000を2個のデータと認識して 123 de-ta 12 0000 jjjj のようになってしまいます。 どなたか12,000をちゃんと読める方法をご存知の方お力をお貸しください。 よろしくお願い致します。
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは そのアプリは、固定長出力はできないでしょうか。 二重引用符もだめだとすると、規則性を利用してロジックで分けるしかありません。 例えば・・ Line Input で1行ずつ取り込み。 念のためカンマの数をカウントしてみる。 カンマの位置で、データを切り出す。Instr()かVB6のSplit()で。 IsNumeric(str)を利用して、データが数値か文字列かを判断する。 例ですと、数値の後ろの項目は文字列になっているので、文字列が後ろに来たら、そこまでの数値を連結する。 てな具合です。 では!
その他の回答 (10)
- tom777
- ベストアンサー率77% (14/18)
難しいですね。 でも、まずカラム数は決まっているのですよね? 123,de-ta,12,000,jjjjの場合はカラムが4になるべき? 一行を一度に読み込み、Split関数などで配列にデータを 分割し、カラム数が必要な値より大きい場合は、配列の後 ろから数値でかつ3桁のものを探して、その前が数値であれ ば繋げるとかすれば、少しいけるかも知れません。 データが 1,222,333,222 でカラム数が2とかの場合は無理ですが。 以上、参考になれば幸いです。
お礼
ありがとうございます。 line input文にてなんとか切抜けました。
- sha-girl
- ベストアンサー率52% (430/816)
123,de-ta,12,000,jjjj あなたは12,000をどうやって12と000は一緒の数値だと見分けました? そこからロジックをたててみて、カンマ区切りを読み込む関数を作ってみてください しかしもしあなたが見分けられない物があるとするとロジックのたてようはありません。 質問だけではわかりませんがおそらく数値、文字、数値、文字などのなんらかパターン があるのでしょう。
お礼
ありがとうございます。 line input文にてなんとか切抜けました。
- imogasi
- ベストアンサー率27% (4737/17069)
既解答の中に、読んで後のロジックで解決する的な話がありますが、今私も別件の解答で失敗しましたが、もしInput #1,a,b,c式で読むと、次々にずれて変数a,b,cなどにセットされ、最後にEof(1)でレコードの終わりを上手く捉えられず、読むデータが無いというエラーに行き付くと思います。ご解答にあるようにメモ帳に読みこんで手作業で,を除くより他無いと思います。解答者は実際テストデータでやってみて頂いて、ご批判を仰ぎたいと思います。
お礼
ありがとうございます。 line input文にてなんとか切抜けました。
- ahoojpn
- ベストアンサー率53% (7/13)
No.5の者です。カンマは小数点のことかと思いましたが、金額のカンマが正しいのでしょうか。金額のカンマとしても、難しいですね。例えば、 12,345とあったとします。 \12と\345とも取れますし、\12345とも取れますね。 金額のカンマを除いた状態で出力すると12,345→12345となり、\12345に固定されてしまいますね。 やはり、カンマが「区切り記号」と「金額のカンマ」との違いが無い限り、無理な気がします。12、234,56、78,90とかになっていないと厳しいでしょう。\12,\234,56,\78,90など金額の頭に「区切り記号」の意味の文字列があったなら良かったのですが。 7_7_7さんは12,345のような場合、\12と\345、\12345、どのように見分けているのでしょうか。
お礼
ありがとうございます。 line input文にてなんとか切抜けました。
- O_cyan
- ベストアンサー率59% (745/1260)
>データの中にカンマが入ったものがたまにあります。 ロジックを組んで取り込もうとする先がカンマがあったりなかったりの可変では ロジックでの対処は難しいのではないですか。 手間になりますが一度別のアプリで読み込んで金額をカンマなしで再出力するとか で取り合えず対処するくらいだと思います。(例えばExcelで読み込んでカンマ編集 を除くとか) 市販のソフトでCSVで出力出来るのであれば金額のカンマを除いた状態で出力する 設定がありそうなものですが。 CSVで出力する際の設定を変更するオプションは無いのでしょうか?
お礼
ありがとうございます。 line input文にてなんとか切抜けました。
- ahoojpn
- ベストアンサー率53% (7/13)
No.3の回答だと、例、12,34,56,78(12,34と56,78)として、「数字と数字の間にあるカンマは数字の一部と見なす」としたら、12.34.56.78("."は小数点)とありえない数値になってしまいます。質問の意図からして、12,000の","は小数点のことだと思いますが、上の例のように、カンマで区切られた数字が連続であった場合、12と34と56と78、12と34.56と78、・・・など、あいまいすぎて法則を見つけるのが非常に困難だと思います。12,000の前後に何か一定の法則がないと、市販のアプリ側が小数点のことを考慮していただく他に無いのでは、と思います。
- bobble
- ベストアンサー率34% (111/323)
市販のソフトなのであれば、販売元のサイトにパッチファイル等がないですかねえ。
お礼
ありがとうございます。 line input文にてなんとか切抜けました。
市販のアプリがそういうの出力してるってことは、それアプリのバグですね(^_^; 裏技つかって何とかするしかないです。 数字と数字の間にあるカンマは数字の一部と見なすとか。
お礼
ありがとうございます。 line input文にてなんとか切抜けました。
- osamuy
- ベストアンサー率42% (1231/2878)
CSVでは、データにカンマが含まれる場合(というか、文字列なら。)は、二重引用符で、クォートするのが、お約束のような。 ex) 3,"12,000","Test" データ作成側で対処すべきかと。
お礼
ありがとうございます。 line input文にてなんとか切抜けました。
- timber
- ベストアンサー率29% (218/739)
CSVファイルを作る側のアプリも777さんが作られてるんですか? 作る側でも何らかの対策を施さないと無理だと思うのですが。 12,000を「"」で括って"12,000"とし、「"]~「"」の「,」は無視するとか。 データ中の「,」は別の文字に置き換えるとか。
お礼
ありがとうございます。 line input文にてなんとか切抜けました。
補足
CSVを作る側は市販のアプリケーションですので改造は無理です。 やはり無理なのでしょうか?
お礼
ありがとうございます。 私もLine Input で1行ずつ取り込み。を考え、とりあえずプログラミングしてみました。 なんとか今、正常に稼動しています。 やはりこの手しかないようですね。