2017-04-05 6 views
1

ひどくフォーマットされた一連のcsvを持っていて、Pythonの標準ライブラリからcsvパーサを使って解析するときに問題があります。本質的に、csvの文字はエスケープ文字ではなく、理解できない出力が出ています。python csv引用符で囲まれたエスケープ文字でCSVを解析できません

パーサーは時には適切な行を得ることができますが、不規則に削除または追加しているようです。たとえば、id = 1のエントリでは、文字列の途中の引用符は削除されますが、末尾の引用符は保持されます。最後のエントリ(id = 3)でも同様のことが起こります。私は、最も外側の引用符がIDのようにエントリにドロップされることを期待します。

また、私が予測可能な方法で線を結合していません。 id = 2のエントリは2つのエントリに分割されており、他の2つはそのまま維持されているが、これは分割されているパターンを理解できません。

csvの形式には多少の曖昧さがあります。それは、エスケープされていない戻り文字以外の解析が困難なことを理解していません。私は無駄にフォーマットのさまざまなパラメータを試してみました。どんな透明性も高く評価されます。ありがとう!

編集:明確にするために、私はCSVファイルを解析する前に文字列の置換を行うことができます。私はなぜ出力が正規ではないように思っています。

コード:

import csv 

with open('text.csv') as csv_file: 
    for line in csv.reader(csv_file): 
     print(line) 

入力:

"id","text" 
"1","This line here 
More Text "quoted" 
"2","This line here "quoted" More Text 
More Text "quoted" More Text" 
"3","This line here 
"quoted" 

出力:

['id', 'text', 'id2'] 
['97910', 'This line here\r\nMore Text quoted"', '1'] 
['97930', 'This line here quoted" More Text'] 
['More Text "quoted" More Text"', '2'] 
['97930', 'This line here\r\nquoted"', '3'] 

所望の出力:

['id', 'text', 'id2'] 
['97910', 'This line here\r\nMore Text "quoted', '1'] 
['97930', 'This line here "quoted" More Text\r\nMore Text "quoted" More Text', '2'] 
['97930', 'This line here\r\n"quoted', '3'] 

答えて

0

埋め込まれた二重引用符の各文字は、二重引用符文字の の対で表される必要があります。

埋め込まれた改行は引用符で囲む必要がありますフィールドで
1997,Ford,E350,"Super, ""luxurious"" truck" 

(ただし、多くのCSV 実装が埋め込まれた改行をサポートしていません)。 CSVファイルを解析したり、二重引用符をエスケープしてCSVファイルを作成しようとする前に、

1997,Ford,E350,"Go get one now 
they are going fast" 

だから、2重引用符で二重引用符を置き換えることができます。


ファイルの各行はデータレコードです。各レコードは、カンマで区切られた1つ以上のフィールドで構成されます。しかし、二重引用符を使用すると、それに対応する二重引用符が見つかるでしょう。もしパーサーがそれを見つけられなければ、二重引用符を得るまで次の行を読むでしょうし、コンマを見つけることができません"2","This line here "quoted" More Textのために、提出された唯一の、同じ理由として

"This line here 
More Text "quoted" 

を扱い、パーサは二重引用符のペアを見つけることができますので、それは次のレコードを読み込みます。

詳細はComma-separated valuesを参照してください。

+0

私はもっと厳しいCSVがどのように見えるのか理解しています。なぜ私は誰かが壊れているのか、他の人は壊れているのか、もっと尋ねています。 –

+0

@QuintonRobbins私は自分の答えを更新します。 – McGrady

+0

私が正しいと認識している行は、引用符の特定の組み合わせのためにパーサーによって偶然に受け取られているだけで、実際にはどれも「正しい」方法で解析されていないことを示唆していますか? –

関連する問題