どのように私はラインのエスケープシーケンスの異なるエンドですべての\ rを\ nを交換します()sedを使用していますか?

のカット:

だから、私はLOAD DATA LOCAL INFILEを使用してMySQLにデータをロードしようとしています。2,400,000行について。

これらの行のうちのいくつかは、データ内の改行とラインを持っており、挿入されていません。

私たちは確信していることの一つは、およそ実際の改行前の最後の文字があるということである"の隣に、我々はすべての改行を変更できるように(二重引用符が)"のような何か他のものであることを"***\r\n

これは、ステートメントを追加するために私を可能にするLINES TERMINATED BY '***\r\n'だけではなく\r\n

たとえば、

私の入力ファイル内の一つのエントリ:in.csvは、(ラインは\ rを\ nで終了しました)

1,223,"{...}","Some title with

line breaks"\r\n

ファイルを処理した後募集出力

1,223,"{...}","Some title with

line breaks"***\r\n
`

代替は、CSVデータ内のすべての改行を削除してのみ行の末尾に改行を持っているだろう。問題は、私は本当に大きなファイル(2GB +)で取り扱っておりますので、私は十分に速く操作を行うするかどうかはわかりませんです

今、私は失敗しセッドしようとしています。私は何かが足りないと思います。ここに私の最も近い試みがあります。

sed ':a;N;$!ba;s/"$/***"\r\n/g' in.csv > out.csv

しかし、これは私のために動作しませんでした。

ありがとうございました。

*** UPDATE ***

私はすべてのレコードがロードデータクエリによって挿入されていたことに気づきました。使用して行数はので、私はそう思っwc-l異なっていましたselect count(*)

私は実現その埋め込まれた改行を有するWC-L遭遇データは、それが同じ行の一部としてそれについてのではなく、別個の行としてみなしたとき。

私はあなたの努力のためのすべてに感謝します。

ティムBiegeleisen:

ここにあなたのニーズを満たす必要がありますPHPスクリプトは次のとおりです。

$fin = fopen("input.txt", "r");
$fout = fopen("output.txt", "w");

while(!feof($fin)) {
    $line = preg_replace("/(?<!\")\r?\n/", "", fgets($fin));
    fwrite($fout, $line);
}

fclose($fin);
fclose($fout);

このソリューションでは、正規表現パターンを使用して(?<!\")\r?\n、それはすぐに二重引用符に従わない場合にのみ、CR?LFを対象とします。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=12669&siteId=1