我有一个管道分隔的数据文件,我想通过 LOAD DATA INFILE 将其加载到 Mysql 中。
类似于:
a|||d|e
x|y|z|0|1
...
我想用 \N
替换空字段,以便数据被识别为 NULL 值。
正在做
sed 's/||/|\\N|/g'
几乎可以工作,但不完全有效 - 在第一个数据行中,第二个管道被 sed 吃掉,因此第二个连续的空字段没有被解析!!!
我的黑客解决方法是将第一个 sed 的结果通过管道进行另一个相同的搜索,并第二次替换以消除那些连续的空字段。
我的问题是,在 sed 中解决这个问题的更优雅的方法是什么(最好一次性完成)?
TIA。
附加说明
如果您计划使用 sed 处理数据文件,还请注意像这样的行尾情况:
h|i|j|k|
您需要通过管道连接到
sed 's/|$/|\\N/g'
处理那些行尾情况。
此外,如果您要从 DOS 系统转到 UNIX 系统,您可能需要使用 sed 搜索和替换从数据文件中删除“\r”。
我建议您在使用 LOAD DATA INFILE 时考虑来自 Mysql 的所有警告 - 它们将帮助您捕获邪恶的情况。
最佳答案
您可以使用重复 (t
) 命令:
echo 'a|||d|e' | sed ':repeat; s/||/|\N|/g; t repeat'
关于csv - 使用 sed 搜索并替换以竖线分隔的文件中的连续匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11507808/