Converte o caractere separador ao escapar do separador nos campos

3

Eu tenho um arquivo de texto com campos delimitados por | . Eu quero convertê-lo para , como um CSV típico. Eu tentei usar isso:

sed 's/|/,/g' test.txt > test.csv

mas alguns dos campos já possuem vírgulas. Por exemplo:

var1|var2|var3
Potter, Harry|2|3

O que devo fazer?

    
por JXU 22.05.2018 / 04:31

4 respostas

2

Tente isso

sed 's/|/","/g; s/^/"/; s/$/"/' file 

Isso produzirá resultados assim:

"var1","var2","var3"
"Potter, Harry","2","3"

Explicação:

Você precisa colocar cada uma de suas colunas usando aspas "" .

  • Primeiro s/|/","/g substitui todos os | por "," vírgula entre aspas Saída: var1","var2","var3 Potter, Harry","2","3

  • Segundo s/^/"/ substitui o início da linha por aspas, em que ^ significa início da linha

  • Terceiro s/$/"/ substitui o final da linha por aspas, em que $ significa fim de linha

Você também pode escapar das vírgulas no campo usando barra invertida antes de cada vírgula algo assim

Potter\, Harry,2,3

Você pode ler mais sobre a formatação de csv aqui: link

    
por 22.05.2018 / 05:21
3

Use a ferramenta correta de analisador csv:

csvtool -t '|' -u ',' cat infile > outputfile
var1,var2,var3
"Potter, Harry",2,3

de csvtool --help :

-t   Input separator char.  Use -t TAB for tab separated input.
-u   Output separator char.  Use -u TAB for tab separated output.
cat
    This concatenates the input files together and writes them to
    the output.  You can use this to change the separator character.  
    
por 22.05.2018 / 07:48
3

Para citar apenas os valores que contêm vírgulas:

$ sed 's/[^|]*,[^|]*/"&"/; y/|/,/' <infile
var1,var2,var3
"Potter, Harry",2,3

Se a entrada já continha caracteres de aspas duplas, e eles não estavam sendo usados para formatação CSV (como para Riddle, Tom "Voldemort"|4|5 ), então para a maioria dos formatos csv, você os escapa com "" :

$ sed 's/"/""/g; s/[^|]*[,"][^|]*/"&"/; y/|/,/' <infile
"Riddle, Tom ""Voldemort""",4,5
    
por 22.05.2018 / 11:12
-1

Você pode modificar seu regex para incluir \ w, que corresponde a qualquer alfanumérico e _ seguido por um |

 #sed 's/\w|/,/g' example.csv 
 var1|var2|var3
 Potter, Harry|2|3
    
por 22.05.2018 / 04:39