2

我有一个以管道分隔的数据文件,我想通过 LOAD DATA INFILE 将其加载到 Mysql 中。

就像是:

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

我想替换一个空字段,\N以便将数据识别为 NULL 值。

正在做

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

几乎可以工作,但不完全 - 在第一个数据行中,第二个管道被 sed 吃掉了,因此第二个连续的空字段不被解析!!!

我的 hacky 解决方法是将第一次 sed 的结果通过管道进行另一次相同的搜索并第二次替换以摆脱那些连续的空字段。

我的问题是,在 sed 中解决这个问题的更优雅的方法是什么(最好一次性完成)?

TIA。

附加说明

如果您打算使用 sed 处理数据文件,还请注意以下行尾情况:

h|i|j|k|

您将需要管道到

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

处理那些终端案件。

此外,如果您要从 DOS 转到 UNIX 系统,您可能希望使用 sed 搜索和替换从数据文件中删除“\r”。

我建议您在使用 LOAD DATA INFILE 时考虑来自 Mysql 的所有警告——它们将帮助您抓住邪恶的情况。

4

1 回答 1

2

您可以使用重复 ( t) 命令:

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