• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CSVデータの区切りが「","」の読み取り方法)

CSVデータの区切りが「","」の読み取り方法

このQ&Aのポイント
  • CSVデータの区切りが「","」で区切られています。
  • 先頭と最後の「"」を削除する方法を教えてください。
  • 「s/"//g」を使用する方法以外で、先頭と最後の「"」を削除する方法があるか教えてください。

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

  • ベストアンサー
  • mikemike7
  • ベストアンサー率87% (97/111)
回答No.3

このような感じでどうでしょう。 foreach $lines (@lines) { $lines =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/; ($name,$addr,$seib) = map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_} ($lines =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g); 省略; } No1,No2さん提示の "山田","埼玉県,入間市",32,"男性" "田中","埼玉県",18,"男性" "井上","栃木県,足利市",25,"女性" "志村","千葉県",33,"男性" "志村","千葉県,,,,,",3,"男性" だった場合でも動くはずです。 以下確認用 foreach $lines (@lines) { $lines =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/; @word = map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_} ($lines =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g); $str = join " : ",@word; print $str."<br>"; } 参考:http://www.din.or.jp/~ohzaki/perl.htm#CSV2Values

hihin2003
質問者

お礼

確認できました!! ありがとうございます。感謝です。 パッチリ変換出来ました。

hihin2003
質問者

補足

ありがとうございます。 ソース表示助かります。 やってみて確認しお礼させてください。

その他の回答 (3)

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.4

CSV の本格的なルールまで言及するなら、改行コードや エスケープ(データ中にダブルクォーテーションを含む場合) なども考慮に入れる必要があり、単純な正規表現では 表しきれないと思います。 http://www.kasai.fm/wiki/rfc4180jp また、メーカー独自のルールが加わる事もあります。 以下のようなプログラムを参考に自作するのが確実のよう です。 http://blogs.wankuma.com/jeanne/archive/2007/04/27/73442.aspx

hihin2003
質問者

お礼

ありがとうございます。 サイト確認して実践してみます

回答No.2

書き忘れましたが、文字列を括っている「"」には、非常に重要な意味があります。 それは「"と"で挟まれた中は、すべて、単なる文字であり、たとえ『,』があっても、それは項目区切りを意味しない」と言う事です。 例えば "山田","埼玉県,入間市","男性" "田中","埼玉県","男性" "井上","栃木県,足利市","女性" "志村","千葉県,,,,,","男性" と言うCSVデータの場合。 2番目の項目は、それぞれ 「埼玉県,入間市」 「埼玉県」 「栃木県,足利市」 「千葉県,,,,,」 として解釈しなければなりません。 「『"』の中の『,』は、項目区切りとして処理してはいけない」のです。 CSVを扱う場合「決して『"』を甘く見てはいけない」です。 「『"』の中の『,』と、『"』の外の『,』は、まったく意味が違う」というのを、忘れないように。

hihin2003
質問者

お礼

詳しい説明ありがとうございます。 "志村","千葉県,,,,,","男性" まさにそうなんです。 実はこれに苦しんでました。

回答No.1

基本的な解釈が間違っています。 "山田","埼玉県","男性" "田中","埼玉県","男性" "井上","栃木県","女性" "志村","千葉県","男性" のCSVファイルの「項目区切り」は、あくまでも「,」のみです。 そして、文字列項目は「項目が"で括ってある」のです。 もし、該当のCSVファイルに「年齢」など、文字列ではない数値項目が入ってきたら "山田","埼玉県",32,"男性" "田中","埼玉県",41,"男性" "井上","栃木県",55,"女性" "志村","千葉県",27,"男性" のようになる筈です。 ですから、項目区切りを「","」だと誤解していると、上記のような「『"』で括られてない数値項目」が混ざった瞬間に、処理が破綻します。 あくまでも「項目は『,』で区切られている」「文字列項目は『"』で括られている」と考えて処理せねばなりません。 従って 1.まず「,」を項目区切りとして、項目(フィールド)に分解する。 2.分解して取り出した各項目の両端に「"」が付いていた場合は、両端の「"」を削る。 と言う、2段階の処理が必要です。

hihin2003
質問者

お礼

早速の回答ありがとうございます。

関連するQ&A