Eu preciso de um script de shell para converter um arquivo csv em um arquivo delimitado por pipe (|) mantendo as vírgulas dentro das aspas

1

Arquivo de amostra (test.csv):

"PRCD-15234","CDOC","12","JUN-20-2016 17:00:00","title, with commas, ","Y!##!"
"PRCD-99999","CDOC","1","Sep-26-2016 17:00:00","title without comma","Y!##!"

Arquivo de saída:

PRCD-15234|CDOC|12|JUN-20-2016 17:00:00|title, with commas, |Y!##!
PRCD-99999|CDOC|1|Sep-26-2016 17:00:00|title without comma|Y!##!

Meu script (não funciona) está abaixo:

while IFS="," read f1 f2 f3 f4 f5 f6; 
do  
    echo $f1|$f2|$f3|$f4|$f5|$f6;  
done < test.csv
    
por Shanthi 07.12.2016 / 18:39

3 respostas

4

(generate output) | sed -e 's/","/|/g' -e 's/^"//' -e 's/"$//'

ou

sed -e 's/","/|/g' -e 's/^"//' -e 's/"$//' $file

Para as 3 expressões:

  • -e 's/","/|/g' = substitua todos os delimitadores "," pelo novo delimitador |

  • -e 's/^"//' = remover a principal marca "

  • -e 's/"$//' = remova o final da linha à direita " mark

Isso preservará as aspas que estiverem no título, desde que não correspondam ao padrão inicial do delimitador ","

    
por 07.12.2016 / 19:13
1

Que tal cat test.csv | sed 's/\",\"/|/g' | sed 's/\"//g'

Assumindo que os dados no seu arquivo são como a forma mostrada acima, (não estou levando em consideração casos de canto). Mas acima funcionou para mim.

    
por 07.12.2016 / 19:07
0

Este lida com delimitadores de string incorporados:

$ cat /tmp/bla
"PRCD-15234","CDOC","12","JUN-20-2016 17:00:00","title, with commas, ","Y!##!"
"PRCD-99999","CDOC","1","Sep-26-2016 17:00:00","title without comma","Y!##!"
"PRCD-99999","CDOC","1","Sep-26-2016 17:00:00","embedded\",delimiters\",","Y!##!"

sed -E 's/"(([^"]*(\")?)*)",/|/g;s/"|(([^"]*(\")?)*)"//g'

PRCD-15234|CDOC|12|JUN-20-2016 17:00:00|title, with commas, |Y!##!
PRCD-99999|CDOC|1|Sep-26-2016 17:00:00|title without comma|Y!##!
PRCD-99999|CDOC|1|Sep-26-2016 17:00:00|embedded\",delimiters\",|Y!##!
    
por 07.12.2016 / 19:11

Tags