while IFS= を使用して CSV ファイルを読み込むが、フィールドが引用符で囲まれている場合はコンマを区切り文字として扱わない

while IFS= を使用して CSV ファイルを読み込むが、フィールドが引用符で囲まれている場合はコンマを区切り文字として扱わない

列がそれぞれカンマで区切られた大きな CSV ファイルがあります。ただし、最初の列自体にカンマが含まれる場合が約 5% あり、これらのフィールド内にカンマが含まれる場合は引用符で囲まれることでこの状態が示されます。

引用符内に含まれるカンマを区切り文字として扱わないように、このファイルを読み込むにはどのような方法が良いでしょうか?

私が考えている最善の方法は、スタックなどを使って複雑な操作を行い、現在引用符で囲まれているかどうかを確認することですが、もっと簡単な方法が必ずあるはずです。注: 引用符の中に引用符が入ったり、これ以外の特殊なケースが発生することはありません。

*例:

  1. アップル、10、12、...。
  2. バナナ、5、10、...
  3. 「バナナ、緑」、3、14、...(この行にはカンマがありますが、それを示すために引用符が付いています)*

デフォルトの動作では、バナナと緑を別々の変数として読み込むのではなく、この最後の行を「バナナ、緑」として変数に読み込みます。

答え1

FPAT 用の GNU awk を使用する場合:

$ 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 <...>
---

関連情報