政府の情報源 (FEC、州の有権者データベースなど) からのデータを処理しています。一貫性のない不正な形式であり、あらゆる種類の楽しい方法で CSV パーサーを壊します。
それは外部から供給され、権威があります。私はそれを解析しなければならず、再入力したり、入力時に検証したりすることはできません。それが現実さ; 私は入力を制御しません。
プロパティ:
- フィールドに不正な形式の UTF-8 が含まれている (例:
Foo \xAB bar
) - 行の最初のフィールドは、既知のセットからレコード タイプを指定します。レコードの種類がわかれば、フィールドの数とそれぞれのデータの種類がわかりますが、実際に確認するまでわかりません。
- ファイル内の任意の行で、引用符付き文字列 (
"foo",123,"bar"
) または引用符なし (foo,123,bar
) を使用できます。特定の行(つまり)内で混合されている場所にはまだ遭遇していませんが、"foo",123,bar
おそらくそこにあります。 - 文字列には、内部改行、引用符、および/またはコンマ文字が含まれる場合があります。
- 文字列には、コンマ区切りの数字を含めることができます。
- データ ファイルは非常に大きくなる可能性があるため (数百万行)、これは依然としてかなり高速である必要があります。
私は Ruby FasterCSV (1.9 では単に CSV として知られています) を使用していますが、質問は言語に依存しない必要があります。
私の推測では、ソリューションには、明確なレコード区切り文字/引用文字 (ASCII RS、STX など) による前処理置換が必要になると思います。私はここで少し始めましたが、私が得るすべてのものでうまくいくわけではありません.
この種のダーティ データを確実に処理するにはどうすればよいでしょうか。
ETA: 以下は、1 つのファイルに含まれる内容の簡単な例です。
"this","is",123,"a","normal","line" 「行」、「内部」、「引用」 「短い線」、「と を 「内部引用符」、1 つのコンマおよび 改行" un "quot" ed,text,with,1,2,3,numbers 「引用」、「番号」、「シリーズ」、「1,2,3」 「無効な \xAB utf-8」