【发布时间】:2013-11-25 03:13:22
【问题描述】:
我有一个我正在尝试处理的 CSV,但我的一些字段包含逗号、换行符和空格,现在我考虑一下,其中可能还有一些撇号。
对于逗号和换行符,我已在输出阶段将它们转换为其他字符串,并在最后将它们转换回来(是的,这很混乱,但我只需要运行一次)我意识到我可能必须这样做这也有空格,但我已将问题分解为基本部分,看看我是否可以解决它
这是一个 input.csv
"john","beatles.com","arse","fool@wonka.com","1","1","on holiday"
"paul","beatles.com","bung","","0","1","also on holiday"
(我试过加引号和不加引号)
这是脚本
INPUT="input.csv"
for i in `cat ${INPUT}`
do
#USERNAME=`echo $i | awk -v FS=',' '{print $1}'`
USERNAME=`echo $i | awk 'BEGIN{FS="[|,:]"} ; {print $1}'`
echo "username: $USERNAME"
done
所以应该只输入 john 和 paul 但我得到了
username: "john"
username: holiday"
username: "paul"
username: on
username: holiday"
因为它会看到空格并将它们解释为新行。
我可以让它停止吗?
【问题讨论】:
-
也许只写一个四行Python脚本?内置的
csv模块可以解析这个没问题。 -
你的
for i in $(cat ...)有问题:i将依次取值"john","beatles.com","arse","fool@wonka.com","1","1","on、holiday"、"paul","beatles.com","bung","","0","1","also、on、holiday"。这不是awk的问题。 -
永远不要使用
for i in $(cat ...)。这是谁给你看的?找到他,让他知道他不仅做错了事,而且还在传播不良做法,浪费你的时间。你真的应该生他的气。 -
现在,只是为了确保您做对了:不要使用
awk、sed、bash等解析 csv 文件。 使用正确的 csv解析器。其中有很多在 Python、Perl 等方面非常出色(这只是一个建议,这样您就不会浪费时间在从一开始就被破坏的方法上)。 -
获取 Arnold Robbins 的《Effective Awk Programming, Third Edition》一书(快!),然后按预期只使用 shell 调用工具。