- ベストアンサー
CSVデータの区切りが「","」の読み取り方法
- CSVデータの区切りが「","」で区切られています。
- 先頭と最後の「"」を削除する方法を教えてください。
- 「s/"//g」を使用する方法以外で、先頭と最後の「"」を削除する方法があるか教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
このような感じでどうでしょう。 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
その他の回答 (3)
- MARU4812
- ベストアンサー率43% (196/452)
CSV の本格的なルールまで言及するなら、改行コードや エスケープ(データ中にダブルクォーテーションを含む場合) なども考慮に入れる必要があり、単純な正規表現では 表しきれないと思います。 http://www.kasai.fm/wiki/rfc4180jp また、メーカー独自のルールが加わる事もあります。 以下のようなプログラムを参考に自作するのが確実のよう です。 http://blogs.wankuma.com/jeanne/archive/2007/04/27/73442.aspx
お礼
ありがとうございます。 サイト確認して実践してみます
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
書き忘れましたが、文字列を括っている「"」には、非常に重要な意味があります。 それは「"と"で挟まれた中は、すべて、単なる文字であり、たとえ『,』があっても、それは項目区切りを意味しない」と言う事です。 例えば "山田","埼玉県,入間市","男性" "田中","埼玉県","男性" "井上","栃木県,足利市","女性" "志村","千葉県,,,,,","男性" と言うCSVデータの場合。 2番目の項目は、それぞれ 「埼玉県,入間市」 「埼玉県」 「栃木県,足利市」 「千葉県,,,,,」 として解釈しなければなりません。 「『"』の中の『,』は、項目区切りとして処理してはいけない」のです。 CSVを扱う場合「決して『"』を甘く見てはいけない」です。 「『"』の中の『,』と、『"』の外の『,』は、まったく意味が違う」というのを、忘れないように。
お礼
詳しい説明ありがとうございます。 "志村","千葉県,,,,,","男性" まさにそうなんです。 実はこれに苦しんでました。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
基本的な解釈が間違っています。 "山田","埼玉県","男性" "田中","埼玉県","男性" "井上","栃木県","女性" "志村","千葉県","男性" のCSVファイルの「項目区切り」は、あくまでも「,」のみです。 そして、文字列項目は「項目が"で括ってある」のです。 もし、該当のCSVファイルに「年齢」など、文字列ではない数値項目が入ってきたら "山田","埼玉県",32,"男性" "田中","埼玉県",41,"男性" "井上","栃木県",55,"女性" "志村","千葉県",27,"男性" のようになる筈です。 ですから、項目区切りを「","」だと誤解していると、上記のような「『"』で括られてない数値項目」が混ざった瞬間に、処理が破綻します。 あくまでも「項目は『,』で区切られている」「文字列項目は『"』で括られている」と考えて処理せねばなりません。 従って 1.まず「,」を項目区切りとして、項目(フィールド)に分解する。 2.分解して取り出した各項目の両端に「"」が付いていた場合は、両端の「"」を削る。 と言う、2段階の処理が必要です。
お礼
早速の回答ありがとうございます。
お礼
確認できました!! ありがとうございます。感謝です。 パッチリ変換出来ました。
補足
ありがとうございます。 ソース表示助かります。 やってみて確認しお礼させてください。