2016-07-12 13 views
1

次の行を持つcsvファイルがあります。あなたが見ることができるように、数字は二重引用符で囲まれていません。csvで不要な二重引用符を削除するJava正規表現

String theLine = "Corp:Industrial","5Nearest",51.93000000,"10:21:29","","","","10:21:29","7/5/2016","PER PHONE CALL WITH SAP, CORRECTING "C","359/317 97 SMRD 96.961 MADV","" 

は、私が上記の行を読み取ろうと、私はそれをしたいのように、このすべてのコンマで分割しない正規表現

String[] tokens = theLine.split(",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))"); 

を使用して分割しました。 "「C」を訂正すると、1つの電話でコールすると、「(カンマ)」と「(二重引用符)」が追加されているため、「C」には電話がかかっています。いくつか私は2つの二重引用符で二重引用符とコンマをエスケープする正規表現を書くことができますか?

私は基本的にしたい:

"Corp:Industrial","5Nearest",51.93000000,"10:21:29","","","","10:21:29","7/5/2016","**PER PHONE CALL WITH SAP CORRECTING C**","359/317 97 SMRD 96.961 MADV","" 
+0

[編集]オプションを使用し、コード例を 'code block'(エディタメニューの' {} 'アイコン)で囲みます。このようにして '*'や '' \ ''のようなすべての文字が出力されます。 – Pshemo

+0

そのCSV回線を生成しているソースを変更できますか?アンバランスな/エスケープされていない引用符を持っているので、正しく機能しません。 – Pshemo

+0

これらの孤立したクォートが決してコンマの近くにないことが分かっていれば、簡単に解決できます。そうでなければ、各フィールドがどのように見えるかを知ることができます。 –

答えて

2

は、パーサは正規表現よりもはるかに優れているジョブがあり、そしてこの種のものは、通常、そのうちの一つです。私はあなたがあなたのために働かせることができないと言っているわけではありませんが、あなたが奉仕することができるオープンソースのCSVパーサーもあります。

あなたのCSVは私には疑わしいと言われています。値がその中に3重引用符を持っていることを

"PER PHONE CALL WITH SAP, CORRECTING "C", 

- それは内部だけ単一引用符で文字列を表現することを意図しているのですか?あるいは、Cは引用符と文字列で囲まれるべきですか?

通常、二重引用符に二重引用符を含める場合は、特別な構文が必要です。 CSVの場合は、最も一般的なオプションは、それを倍にされるだろう、またはバックスラッシュなどの文字でエスケープ:

"PER PHONE CALL WITH SAP, CORRECTING ""C""", 

または:直接正規表現を使用してあなたの問題が変更されるの

"PER PHONE CALL WITH SAP, CORRECTING \"C\"", 

なしCSVが整形されていれば、それを解析する確率は上がります。

+0

ジェフリー、お返事ありがとうございます。 – sboga

+0

Geoffrey、私は既にapache CSVParserを試していましたが、この特定の行を読むと、それは爆発します。あなたはこれがうまくフォーマットされたCSVではないと言ったように。たびにファイルがあり、 – sboga

+0

Geoffreyでこの形式でファイルを作成しています。私はすでにapache CSVParserを試していました。この特定の行を読むと、それは爆発します。あなたが言ったように、これは整形されたCSVではありません。毎回、この形式でファイルを作成しています。私の仕事はこれらのファイルを解析することです。私がtheLine.splitをしたとき( "、(?=(?:[^ \")* \ "[^ \"] * \ ")*(?![^ \"] * \ ")))すべての人にトークンを渡すのではなく、トークンを4つしか持たない」と語った。 – sboga

関連する問題