2012-03-23 7 views
0

以下の形式のCSVファイルがあります。区切り文字としてカンマを基にしたPerl splitコマンドを使用しています。問題は、引用符付きの文字列"HTTP Large, GMS, ZMS: Large Files"がカンマで埋め込まれているため、失敗します。配列の値の要素数は少なくなります。 splitコマンドを変更するにはどうしたらいいですか?このようText::CSVなどのモジュールが作成された理由を埋め込まれたカンマなどの区切りを使用してCSV引用文字列CSVファイルをPerlで区切ります。

my @values = split('\,', $line); 

CSVファイル

10852,800 Mob to Int'l,235341739,573047,84475.40,0.0003,Inbound,Ber unit 
10880,"HTTP Large, GMS, ZMS: Large Files",52852810,128,13712.68,0.0002,,Rer unit 
13506,Presence National,2716766818,2447643,309116.40,0.0001,Presence,per Cnit 
+6

あなたの質問は質問を頼むことができます願っていますCSV-1.21/lib/Text/CSV.pm)モジュールの代わりに、このような問題を処理しますか? –

+2

1つのレッスンで、すべてのプログラマーが学ばねばなりません。自分でCSVまたはHTMLをすべて解析しないでください。既存のモジュールを使用して、彼らは通常成熟し、安定しており、十分にテストされています。 – dgw

答えて

4

問題は正確にしています。データにコンマが埋め込まれていない場合にのみ、正規表現を機能させることができます。データにコンマが埋め込まれている場合は、コンマで埋め込まれたCSVを扱うように設計されたツールに移り、Perl(およびその親族Text::CSV_PPおよびText::CSV_XS)のText::CSVになります。

+0

私はText :: CSV_PPまたはText :: CSV_XSを使用する必要がありますか?違いはなんですか?それはperlで動くでしょうか?sun4-solaris-64-ldのために作られたv5.8.7 – Arav

+1

あなたは 'Text :: CSV'を使い、インストールします。純粋なPerlの実装である 'Text :: CSV_PP'(' _PP'接尾辞は '純粋なPerl'を示し、Cコンパイラは必要ありません)が付属しています。次に、あなたのシステムから最大のパフォーマンスを引き出すために、Perl拡張機構とCコード関数を使って同じコードの高速版を実装する 'Text :: CSV_XS'をインストールします。 'Text :: CSV'は、Perl 5.8が登場する以前から存在していました。 5.8.7で正常に動作します。現在のメンテナーの最初のリリースは2007年です。 (私の個人的なアーカイブを検索して、1997年7月からText-CSV-0.01.tar.gzを見つけました) –

+0

情報のおかげで多く – Arav

0

私はあなたと同じアプローチを使いました。それは私とうまく動作します。このコードを試してください。なぜ使用しない(例えば)[ `テキスト:: CSV`](http://search.cpan.org/~makamaka/Text- -

my @values = split(/(?<="),(?=")/, $line); 

は、それが

+1

あなたのコードはOPのデータとこの部分で壊れます: '1234、あなたのファイルに埋め込まれていますか? "、"それは壊れますか? "' 'Text :: CSV'モジュールだけを使用すると正しいresutlsを返します。 –

+0

情報ありがとうございました – Arav

+0

@ Ven'Tatsu私はあなたの意見を持っていましたが、彼はその例とコードに基づいて私の選択肢を提案しました。分割された彼の質問に基づく修正。 – quinekxi

関連する問題