2012-11-22 13 views
5

Używam edytora strumieniowego sed do przekonwertowania dużego zestawu plików tekstowych (400MB) do formatu csv.sed - usuń cytaty w cudzysłowach w dużych plikach CSV

doszedłem bardzo blisko do końca, ale wybitny problemem są cytaty w cudzysłowie, na danych jak ten:

1,word1,"description for word1","another text",""text contains "double quotes" some more text" 
2,word2,"description for word2","another text","text may not contain double quotes, but may contain commas ," 
3,word3,"description for "word3"","another text","more text and more" 

Pożądana wyjściowy:

1,word1,"description for word1","another text","text contains double quotes some more text" 
2,word2,"description for word2","another text","text may not contain double quotes, but may contain commas ," 
3,word3,"description for word3","another text","more text and more" 

Szukałem wokół o pomoc, ale nie jestem zbyt blisko rozwiązania, próbowałem następujące seds z wzorami regex:

sed -i 's/(?<!^\s*|,)""(?!,""|\s*$)//g' *.txt 
sed -i 's/(?<=[^,])"(?=[^,])//g' *.txt 

Są z poniższych pytań, ale nie wydają się działać dla sed:

Related question for perl

Related question for SISS

Oryginalne pliki * .txt i próbuję edytować je w miejscu sed.

+0

Jakie są pożądane wyniki? –

+0

Zaktualizowałem, dzięki. – nol

Odpowiedz

2

Oto jeden ze sposobów korzystania GNU awk i FPAT zmiennej:

gawk 'BEGIN { FPAT="([^,]+)|(\"[^\"]+\")"; OFS=","; N="\"" } { for (i=1;i<=NF;i++) if ($i ~ /^\".*\"$/) { gsub(/\"/,"", $i); $i=N $i N } }1' file 

wyniki:

1,word1,"description for word1","another text","text contains double 
quotes some more text" 2,word2,"description for word2","another 
text","text may not contain double quotes, but may contain commas ," 
3,word3,"description for word3","another text","more text and more" 

Objaśnienie:

Korzystanie FPAT, pole definiuje się albo jako „wszystko, co nie jest przecinkiem "ani" podwójnym cudzysłowem, czymkolwiek, co nie jest podwójnym qu i podwójny cytat zamykający ". Następnie w każdym wierszu wejścia przeprowadź pętlę przez każde pole , a jeśli pole zaczyna się i kończy podwójną kwotą, usuń z pola wszystkie cytaty z . Na koniec dodaj podwójne cudzysłowy otaczające pole .

+0

@alinsoar, dziękuję oboje.Na koniec, odpowiedź steve pomógł mi zakończyć go z lepszym wynikiem, nawet jeśli nie był to sed. – nol

+0

To rozwiązanie nie działa na Mac OSX Shell (Sierra) –

+0

@RiccardoDonato: Używasz 'gawk' (GNU AWK)?' FPAT' jest specyficzny 'gawk' – Steve

1
sed -e ':r s:["]\([^",]*\)["]\([^",]*\)["]\([^",]*\)["]:"\1\2\3":; tr' FILE 

To wygląda na struny typu "STR1 "STR2" STR3 " i konwertuje je do "STR1 STR2 STR3". Jeśli coś znajdzie, powtarza się, aby upewnić się, że eliminuje wszystkie zagnieżdżone ciągi na głębokości> 2.

Zapewnia również, że żaden ze STRx nie zawiera comma.

+0

dziękuję, to już prawie wszystko, otrzymuję '1, słowo 1," opis dla słowa 1 "," inny tekst "," tekst zawiera podwójne cytaty "trochę więcej tekstu" 'w pierwszej linii jednak. co robi \ 1 \ 2 \ 3 do? – nol

Powiązane problemy