我编写了一个脚本,使用 sed 清理 .csv 文件,删除一些错误的逗号和错误的引号(不好的,意味着它们破坏了我们用来转换这些文件的内部程序):
# remove all commas, and re-insert the good commas using clean.sed
sed -f clean.sed $1 > $1.1st
# remove all quotes
sed 's/\"//g' $1.1st > $1.tmp
# add the good quotes around good commas
sed 's/\,/\"\,\"/g' $1.tmp > $1.tmp1
# add leading quotes
sed 's/^/\"/' $1.tmp1 > $1.tmp2
# add trailing quotes
sed 's/$/\"/' $1.tmp2 > $1.tmp3
# remove utf characters
sed 's/<feff>//' $1.tmp3 > $1.tmp4
# replace original file with new stripped version and delete .tmp files
cp -rf $1.tmp4 quotes_$1
这是 clean.sed:
s/\",\"/XXX/g;
:a
s/,//g
ta
s/XXX/\",\"/g;
然后它删除临时文件和中提琴,我们有一个以单词“quotes”开头的新文件,我们可以将其用于其他进程。
我的问题是:
为什么我必须制作 sed 语句来删除该临时文件中的 feff 标记?原始文件没有它,但它总是出现在替换文件中。起初我以为 cp 导致了这个问题,但是如果我在 cp 之前放入要删除的 sed 语句,则它不存在。
也许我只是错过了一些东西......
U+FEFF 是一个代码点字节顺序标记 http://en.wikipedia.org/wiki/Byte_order_mark。您的文件很可能包含以 UTF-16 保存的数据,并且 BOM 已被您的“清理过程”损坏,而“清理过程”很可能需要 ASCII。删除 BOM 可能不是一个好主意,而是修复脚本以使其从一开始就不会损坏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)