while IFS=를 사용하여 CSV 파일을 읽지만 필드가 따옴표 안에 있는 경우 쉼표를 구분 기호로 처리하지 않습니다.

while IFS=를 사용하여 CSV 파일을 읽지만 필드가 따옴표 안에 있는 경우 쉼표를 구분 기호로 처리하지 않습니다.

각 경우에 열이 쉼표로 구분되는 큰 CSV 파일이 있습니다. 그러나 첫 번째 열의 약 5%에는 자체적으로 쉼표가 포함되어 있으며 이러한 필드 내부에 쉼표가 있는 경우 필드 주위에 따옴표가 있다는 사실로 표시됩니다.

쉼표가 따옴표 안에 포함될 때마다 구분 기호로 취급하지 않도록 이 파일을 읽는 좋은 방법은 무엇입니까?

제가 생각하는 가장 좋은 방법은 스택을 사용하여 복잡한 작업을 수행하거나 현재 견적 범위 내에 있는지 확인하는 것이지만 더 쉬운 방법이 분명 있을 것이라고 생각합니다. 참고: 인용문 안에 인용문이 있거나 이 이외의 다른 특수 사례는 없습니다.

*예:

  1. 애플, 10, 12, ....
  2. 바나나, 5, 10, ...
  3. "Banana, green", 3, 14, ... (이 줄에는 쉼표가 있지만 이를 나타내는 따옴표가 있습니다.)*

바나나와 녹색을 별도의 변수로 읽는 기본 동작보다는 이 마지막 줄에서 변수를 "Banana, green"으로 읽고 싶습니다.

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

관련 정보