使用 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 <...>
---

相關內容