Removendo um campo de um texto delimitado por vírgula com caracteres acentuados

1

Eu tenho um arquivo CSV que é assim

name;address;phone;email
John;123 La Sierra;555-121212;[email protected]
Nick;456 La Bongaa;555-121232;[email protected]
Carl;789 La Fountain;553-121212;[email protected]

e eu quero remover a última entrada, fazendo com que seja

name;address;phone;
John;123 La Sierra;555-121212;
Nick;456 La Bongaa;555-121232;
Carl;789 La Fountain;553-121212;

O último ; tem que ser mantido lá, mas o último campo foi removido.

Encontrei este código em uma questão minha e adaptado a este caso

perl -000ne '@f=split(/;/); print join(";",@f[0..2]) , "\n"' myFile.csv

Eu pensei que seria dividido por ; e, em seguida, juntar apenas os campos 0, 1 e 2, mas não está funcionando.

O comando

file me fornece esse resultado sobre myFile.csv

UTF-8 Unicode text, with CRLF line terminators

O arquivo contém caracteres acentuados que eu acho que podem interferir com isso.

Alguma idéia?

    
por SpaceDog 15.08.2017 / 01:31

3 respostas

4

Como não tenho certeza se você quer tanto um código perl , aqui está um código awk semelhante:

awk -F';' -v OFS=';' '{ $NF=""; print }' data.csv

= > Este código esvazia o último campo de cada linha ( $NF="" ). Campos de entrada ( -F\; ) e campos de saída ( OFS=';' ) são ditos separados por ";".

O mesmo com sed :

sed 's/[^;]*$//' data.csv

= > Isso substitui ( s/.../.../ ) a sequência mais longa de caracteres que não é ";" ( [^;]* ) no final da linha ( $ ) sem nada.

O mesmo com grep :

grep -o '.*;' data.csv

= > As expressões regulares grep são gananciosas por padrão, o que significa que elas correspondem à sequência mais longa possível. Aqui .*; significa "a sequência mais longa de caracteres que termina com um"; ". A opção -o mostra o que é correspondido em vez da linha inteira.

Finalmente, um perl equivalente seria (graças a @steeldriver):

perl -F';' -lpe '$F[-1]=""; $_ = join ";", @F' data.csv

= > Ele funciona de forma semelhante a awk , sendo a junção explícita aqui.

    
por 15.08.2017 / 01:44
1

A maneira bash e o shell parameter expansion :

"${line%;*};"
    
por 15.08.2017 / 05:00
1

Sem corte? : (

Se você for jogar com arquivos CSV, o recorte deverá se tornar um amigo:

cut -f 1-3 -d';' semico.csv | xargs -I{} echo {}";"

Divisão: Cortar (extrair) as colunas 1 a 3, delimitadas com ';' Em seguida, para cada linha (como corte removeria o último ';', passe para xargs e eco line +;

Mais devagar do que o grep, mas a longo prazo provavelmente é melhor usar a ferramenta certa para o trabalho

Alternativa porque as pessoas não estão felizes com xargs: cut -f 1-3 -d';' semico.csv | sed 's/$/;/'

A mesma coisa, mas com sed, onde você diz para substituir o fim da linha;

    
por 15.08.2017 / 04:16

Tags