我有一个大型 CSV 文件,其中各列均以逗号分隔。然而,大约 5% 的情况下,第一列本身包含逗号,并且通过以下事实来表示:如果这些字段内部有逗号,则这些字段周围将有引号。
阅读此文件的好方法是什么,以便我们在引号中包含逗号时不将逗号视为分隔符?
我想到的最好的方法是用堆栈做一些复杂的事情,或者看看我们当前是否在引号内,但我认为肯定有一种更简单的方法。注意:引用中永远不会有引用,也不会出现除此之外的任何其他极端情况。
*例子:
- 苹果、10、12、...
- 香蕉、5、10、...
- "Banana, green", 3, 14, ...(注意这一行中有一个逗号,但它有引号来表明这一点)*
我想将最后一行读入变量“香蕉,绿色”,而不是默认行为将香蕉和绿色读为单独的变量。
答案1
使用 GNU awk 进行 FPAT:
$ cat tst.awk
BEGIN { FPAT="[^,]*|\"[^\"]*\"" }
{
print
for (i=1; i<=NF; i++) {
print "\t" i, "<" $i ">"
}
print "---"
}
$ awk -f tst.awk file
Apple,10,12,...
1 <Apple>
2 <10>
3 <12>
4 <...>
---
Banana,5,10,...
1 <Banana>
2 <5>
3 <10>
4 <...>
---
"Banana, green",3,14,...
1 <"Banana, green">
2 <3>
3 <14>
4 <...>
---