2

LOADDATAINFILEを介してMysqlにロードしたいパイプ区切りのデータファイルがあります。

何かのようなもの:

a|||d|e
x|y|z|0|1
...

空のフィールドをに置き換え\Nて、データがNULL値として認識されるようにします。

やって

sed's / || / | \\ N | / g'

ほとんど機能しますが、完全ではありません-その最初のデータ行では、2番目のパイプがsedによって消費され、2番目の連続する空のフィールドが解析されません!!!

私のハッキーな回避策は、最初のsedの結果をパイプ処理して別の同一の検索を実行し、2回目に置き換えて、これらの連続する空のフィールドを削除することです。

私の質問は、sedで(できれば1回のパスで)この問題を回避するためのよりエレガントな方法は何ですか?

TIA。

追記

sedを使用してデータファイルを処理する場合は、次のような行末の場合にも注意してください。

h | i | j | k |

にパイプする必要があります

sed's / | $ / | \\ N / g'

それらの行末のケースを処理します。

また、DOSからUNIXシステムに移行する場合は、sedの検索と置換を使用してデータファイルから「\r」を消去することをお勧めします。

LOAD DATA INFILEを使用するときは、Mysqlからのすべての警告を考慮することをお勧めします。これらの警告は、悪意のあるケースを見つけるのに役立ちます。

4

1 に答える 1

2

repeat(t)コマンドを使用できます。

echo 'a|||d|e' | sed ':repeat; s/||/|\N|/g; t repeat'
于 2012-07-16T15:50:34.373 に答える