• ベストアンサー

CSVからのデータの取り出し

困ってしまいました。助けてください。 CSVからデータを取りだす事が出来たのですが、 データに値段が入っているため、カンマ切りで失敗してしまいます。 FNAME,LNAME,"12,400",0,0,0,"2,400","3,800" 料金が三ケタ目にカンマを打つので、それで、 split(/,/, $data); でデータを分裂させるとおかしくなってしまいます。 正規表現でヒットさせて置換などを使いたいのですが、分からず。 データ自体をいじるのはNGです。 ""の間の,が取れれば良いのですが。 値段表示に,はいりません。取ってしまいたいのですが。 助けてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.4

こんちは $data = q{FNAME,LNAME,"12,400",0,0,0,"2,400","3,800"}; @a = map {s/[",]//g;$_} $data =~ /(\"[^"]+\"|[^,]+)(?:,|$)/g; print join(" - ", @a);

その他の回答 (3)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

Text::CSV を使う。 それがいやならこんな感じで。 #!/usr/bin/perl use strict; use warnings; while (my $line = <DATA>) { chomp $line; my @f = $line =~ m/\G([^,"]+|"[^"]+"|),?/g; pop @f unless $line =~ m/,$/; print join(':', @f), "\n"; } __END__ FNAME,LNAME,"12,400",0,0,0,"2,400","3,800" FNAME,LNAME,"456,312,400",,,,"2,400","3,800" FNAME,LNAME,"456,312,400",,,,"2,400","3,800", 実行結果 FNAME:LNAME:"12,400":0:0:0:"2,400":"3,800" FNAME:LNAME:"456,312,400"::::"2,400":"3,800" FNAME:LNAME:"456,312,400"::::"2,400":"3,800":

  • auty
  • ベストアンサー率58% (284/486)
回答No.2

訂正 ・ JavaScriptの書式で恐縮ですが、""の中のカンマと""を先に取り出します。   さらに、100万未満と仮定します。 ss = 'FNAME,LNAME,"12,400",0,0,0,"2,400","3,800"'; ss2= ss.replace(/\"([0-9]{0,3}),?(\d{1,3})\"/g,"$1$2"); alert(ss2); 結果 ------------------------------------------------------------ FNAME,LNAME,12400,0,0,0,2400,3800

  • auty
  • ベストアンサー率58% (284/486)
回答No.1

カンマのみですが、 ・ 「先読み言明」というのが使えませんか。 直後に数字でないものが続くカンマ split(/,(?=[^0-9])/)