Celem tego pytania jest udzielenie odpowiedzi kanonicznej.Jaki jest najskuteczniejszy sposób wydajnego analizowania pliku CSV za pomocą awk?
Biorąc CSV, jak mogłoby być generowane przez Excel lub innych narzędzi z osadzonymi znakami nowej linii, osadzone cudzysłowy i pustych pól, takich jak:
$ cat file.csv
"rec1, fld1",,"rec1"",""fld3.1
"",
fld3.2","rec1
fld4"
"rec2, fld1.1
fld1.2","rec2 fld2.1""fld2.2""fld2.3","",rec2 fld4
Jaka jest najbardziej solidną drogę efektywne wykorzystanie awk zidentyfikować poszczególne rekordy i pola :
Record 1:
$1=<rec1, fld1>
$2=<>
$3=<rec1","fld3.1
",
fld3.2>
$4=<rec1
fld4>
----
Record 2:
$1=<rec2, fld1.1
fld1.2>
$2=<rec2 fld2.1"fld2.2"fld2.3>
$3=<>
$4=<rec2 fld4>
----
, więc może być używany jako te rekordy i pola wewnętrznie przez resztę skryptu awk.
Prawidłowy plik CSV to taki, który jest zgodny z RFC 4180 lub może być generowany przez MS-Excel.
Rozwiązanie musi tolerować koniec rekordu będącego po prostu LF (\n
), co jest typowe dla plików systemu UNIX, a nie CRLF (\r\n
), zgodnie z tym standardem, a wygenerowałby go Excel lub inne narzędzia systemu Windows. Będzie także tolerował niecytowane pola pomieszane z cytowanymi polami. Nie trzeba będzie specjalnie tolerować ucieczki "
s z poprzedzającym ukośnikiem odwrotnym (tj. \"
zamiast ""
), jak pozwalają na to inne formaty CSV - jeśli to masz, dodanie z wyprzedzeniem gsub(/\\"/,"\"\"")
poradzi sobie z tym i spróbuje automatycznie obsłużyć oba mechanizmy ucieczki jeden skrypt spowodowałby, że skrypt byłby niepotrzebnie delikatny i skomplikowany.