web-dev-qa-db-ja.com

区切りファイルを処理する最良の方法

そのため、CSVファイルでは通常、フィールドと行の区切り文字としてカンマと戻り文字を使用します。

これにより、これらの両方の文字を含む可能性のあるテキストで明らかな問題が発生します。

明らかにそこにオプションがあります(それらをエスケープする)が、人々はこれをどのように処理しますか?異なる文字を使用してください-パイプまたはティルダ?それらを脱出しますか?区切られたファイルを使用しないでください。結局のところ2010年になり、XMLができました。

問題が発生しない適切な機会を探すために、少なくとも努力を探します。

(明確にするために、これはより堅実なものではなく、好奇心からの質問です。これは、データを何度も何度も何度も試してみたものですが、常に問題に巻き込まれますが、通常は少し汚い感じがします。他の人の経験は何だったのかと思った)。

16
Jon Hopkins

Wikipedia によると:

コンマが埋め込まれたフィールドは、二重引用符で囲む必要があります。

そしてさらに:

二重引用符が埋め込まれたフィールドは二重引用符で囲む必要があり、埋め込まれた二重引用符はそれぞれ二重引用符のペアで表す必要があります。

誰がそれを発明したのかはわかりませんが、最終的には脱出する必要があることを効果的に示しています。これが唯一の固い解決策です。それ以外はすべて、ダクトテープの上にあるダクトテープです。おそらく今のところ機能しますが、最終的には、例外の例外に例外が必要な場合にぶつかるでしょう。ルールの泥沼になるまでに時間がかかりません。単純なエスケープ文字ソリューションよりもはるかに複雑です。

CSV作成者は最初に、二重引用符で囲まれた特殊な構文を考案してカンマのエスケープを回避しようとしましたが、その後、誰かが二重引用符の文字も保存したかったため、その時点でエスケープする必要がありました。エスケープ文字としての二重引用符。彼らがそもそも適切にエスケープすることを決定した場合、構文はより簡単になります。

13
Joonas Pulakka

私はあなたがこのようなものを持っていると仮定しています:

Foo,Baz,,,"Foo,Baz"

区切り文字を含む文字列が引用符で囲まれていないかエスケープされていない場合、ファイルを解析する信頼できる方法はrealにはありません。

ただし、データを調べて解析し、次のような結論を引き出すことができます。

  • カンマで区切られたフロートは文字列として扱われるべきです
  • この前後の行に含まれる区切り文字が少ない場合、この行の解析をスキップしてログに記録します
  • 「のように扱う」

このようなものを処理するためにパーサーを作成する必要がありますが、複雑である必要はありません。

私の経験では、Excelのようなものから大量のダンプをインポートすると、常に戻っていくつかの奇妙な点を確認する必要があります。あなたの課題は、あなたのプログラムにjustデータに関して十分な常識を与えて、それが狂った挿入をしないようにすることです。次に、ログに記録された内容を確認し、洗浄/すすぎ/繰り返します。

私はかつて、すべてのUbuntuワークステーションを使用する小さな会社の内部FAQを処理しました。FAQの一部が「シェルショートカット」を提供し、それが私に来ましたanswersも通常はパイプで区切られ(つまり、grep foo |何か)、引用符で囲まれたりエスケープされたりしませんでした。

2
Tim Post

ポイントまでのCSVに問題はありません

CSVは、形式を変更する可能性が低く、受信者のパーサーに多くの驚きを与えない、厳密に定義されたデータに適しています。

ここに大きな落とし穴の便利なリストがあります:

  1. ""内の ""のエスケープ(フィールドにはフィールド区切り文字が含まれます)
  2. ""にはCRLFが含まれます(フィールドには行区切り文字が含まれます)
  3. Unicode(基礎となるテキスト形式では不十分な場合があります)
  4. OSごとに異なる行終端文字(CRまたはCRLFまたはLFまたはNUL?)
  5. インラインコメント(#、//、-、;などで始まる行)
  6. バージョン管理(ファイルの最新バージョンには、多かれ少なかれフィールドが含まれています)
  7. NULLと空のデータを区別する(、 ""、は空ですが、,はnull?)

これには、フィールドの解析方法を記述するメタデータヘッダーを使用してアプローチできますが、XMLを使用することもできます。それが発明されたのは、この種のフリーフォームのCSVの混乱のためです。 XMLのアプローチは、一見したところ単純な問題である可能性があるものには重すぎます。

人気のある代替策は、「奇妙な文字区切り文字」戦略です。 |のようなものを使用するので、これは上記のエスケープ問題の多くを回避します。 (パイプ)フィールド区切りの文字、およびレコード終了のCRLF。これは複数行フィールドの問題を回避しません(フィールドカウンターを使用しない限り)が、人間用に適切にフォーマットされた行を取得します。

全体として、この種類のファイルを処理する簡単な方法を探しているだけの場合、Javaの世界では、単純に OpenCSV をスローすることができます。すべての問題を確立されたフレームワークに抽象化する方法。

2
Gary Rowe

特に顧客がアプリケーションにインポートする必要のあるデータを書き込む最も簡単な方法である必要があるため、CSVは依然として多くの状況で有効なフォーマットです。 XMLは非常に冗長で、「怖い」山かっこがすべて含まれているためか、XMLの扱いを好むお客様はほとんどいません。合意された文字で区切られた項目の単純なリストに頭を悩ませるのは非常に簡単です。また、同じ文字がフィールドのコンテンツで許可されないことにも同意します。

それでも、入力を正しく処理し、無効な文字が使用されている状況を確認する必要があります。 CSV解析のニーズにFileHelpersを使い始めました。

2
Dave

私はいつも標準に固執し、それらをエスケープします。ほとんどのプログラミング言語では、組み込みのサポートやライブラリが利用できます。

どのフォーマットが使用されるかは状況によって異なりますが、CSVは単純なデータフォーマット構造を交換するのに適したフォーマットです。

1
Salandur

CSVを忘れて、[〜#〜] json [〜#〜]を使用します。書きやすく、解析も簡単です。 XMLはso 2005です。

0
user281377

通常、自分がやっていることは、CSVファイルではなくTSV(タブ区切り値)を取得し、ファイルをEmacsにプルして、使用しないいくつかの一般的でない文字を確認します(通常、ここでは$が適切です)。次に、すべてのタブを$に変換します。

そこから、GNU AWKに$をフィールド区切り文字として使用するように指示できます。ボブはあなたの叔父です。

0
John R. Strohm