ほとんどの人が「なんだ?」と思うはずの質問がありますが、それでも私はそれを持っています。
ベンダーから大量のデータ ファイルを受け取りました。カンマで区切られておらず、値が引用符で囲まれていないことを除いて、CSV であると主張するカスタム フラット ファイル形式です。したがって、実際には CSV ではありません。
foo,bar,baz
alice,bob,chris
などなど、はるかに長くて面白くないことを除いて。問題は、一部のレコードに改行が埋め込まれていることです (!!!):
foo,bar
rab,baz
alice,bob,chris
これは、それぞれ 3 つのフィールドの 2 つのレコードであると想定されています。通常、私は「いいえ、これはばかげています」と言うだけですが、無意識によく見てみると、実際の行末シーケンスとは異なる種類の行末であることがわかりました。
foo,bar\n
rab,baz\r\n
alice,bob,chris\r\n
最初の行の \n に注意してください。これは、私が見つけた埋め込み改行のすべてのケースに当てはまると判断しました。したがって、基本的に行う必要がありますs/\n$//
(この特定のコマンドを試しましたが、何もしませんでした)。
注: 実際にはフィールドの内容は気にしないので、改行を何も置き換えなくても問題ありません。ファイルの各行に同じ数のレコードが必要です (理想的には、同じ場所に)。
ファイルを処理するために作成したツールには、既存のソリューションがあります。
Guid g = Guid.NewGuid();
string data = File.ReadAllText(file, Encoding.GetEncoding("Latin1"));
data = data.Replace("\r\n", g.ToString()); //just so I have a unique placeholder
data = data.Replace("\n", "");
data = data.Replace(g.ToString(), "\r\n");
ただし、これは 1 ギガバイト程度を超えるファイルでは失敗します。(また、私はそれをプロファイリングしていませんが、犬も遅いと思います)。
私が自由に使えるツールは次のとおりです。
- cygwin ツール (sed、grep など)
- 。ネット
これを行う最善の方法は何ですか?