使用 while IFS= 读取 CSV 文件,但如果字段在引号中,则不将逗号视为分隔符

使用 while IFS= 读取 CSV 文件,但如果字段在引号中,则不将逗号视为分隔符

我有一个大型 CSV 文件,其中各列均以逗号分隔。然而,大约 5% 的情况下,第一列本身包含逗号,并且通过以下事实来表示:如果这些字段内部有逗号,则这些字段周围将有引号。

阅读此文件的好方法是什么,以便我们在引号中包含逗号时不将逗号视为分隔符?

我想到的最好的方法是用堆栈做一些复杂的事情,或者看看我们当前是否在引号内,但我认为肯定有一种更简单的方法。注意:引用中永远不会有引用,也不会出现除此之外的任何其他极端情况。

*例子:

  1. 苹果、10、12、...
  2. 香蕉、5、10、...
  3. "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 <...>
---

相关内容