IFS =を使用するとCSVファイルを読み取ることができますが、フィールドが引用符で囲まれている場合、カンマは区切り文字として扱われません。

IFS =を使用するとCSVファイルを読み取ることができますが、フィールドが引用符で囲まれている場合、カンマは区切り文字として扱われません。

列をカンマで区切った大容量CSVファイルがあります。ただし、約5%の場合、最初の列自体にカンマが含まれています。これは、フィールド内にカンマが含まれている場合、そのフィールドの周りに引用符があることを示しています。

引用符の中にカンマがあるときにカンマが区切り文字で表示されないように、このファイルを読むのに最適な方法は何ですか?

私が考える最善の方法は、スタックで複雑な作業を実行するか、現在の引用符内にあるかどうかを確認することですが、より簡単な方法があるはずです。注:引用符の中に引用符を含めることはできず、それを超える他の特別なケースもありません。

*例:

  1. アップル、10、12、...
  2. バナナ、5、10、...
  3. "Banana, green", 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 <...>
---

おすすめ記事