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

관련 정보