Remova todo o tipo de caracteres especiais no arquivo unix .csv

3

Estou processando um fluxo enorme de dados CSV provenientes de uma fonte que inclui caracteres especiais, como os seguintes:

'÷ Þ Ÿ ³ Ù ÷'

Aqui está uma linha de exemplo de um conjunto de dados que inclui esses caracteres:

'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'

Aqui está outro exemplo tirado de um conjunto de dados diferente:

WCP16,2013-06-04 20:06:24,2013-06-04,CPU,PrimeNumberGenerationTest,PASS,USA,H‌​F0SXV1,,,N,9999
WCP06,2013-06-04 20:06:24,2013-06-04,CPU,RegisterTest,PASS,USA,HF0SXV1,,,N,99‌​99
WCD42,2013-06-04 20:06:24,2013-06-04,DVDMINUSRW,MainICTest,PASS,USA,HF0SXV1,,‌​,N,9999
WCP09,2013-06-05 01:52:53,2013-06-05,CPU,SSE3Test,PASS,,?÷ÞQ»,,,N,9999
WCP10,2013-06-05 01:52:53,2013-06-05,CPU,SSE4_1Test,PASS,,?÷ÞQ»,,,N,9999

Se eu soubesse que tipo de caracteres esperar, então eu poderia lidar com isso em Informatica quando eu ler o arquivo.

Mas, na minha situação, não sei ao certo que tipo de dados eu receberei em um determinado dia e, como resultado, meus trabalhos estão falhando. Então eu preciso de uma maneira de remover todos os caracteres especiais dos dados.

    
por deepuu 07.11.2017 / 10:36

1 resposta

5

Eu não tenho certeza exatamente o que você quer dizer com "caracteres especiais", então eu vou assumir que você quer se livrar de não- ASCII caracteres. Existem algumas ferramentas diferentes que podem funcionar para você. Os primeiros que me vêm à mente são:

  1. iconv (conversão de internacionalização)
  2. tr (traduzir)
  3. sed (editor de fluxo)

iconv (conversão de internacionalização)

Aqui está uma solução usando iconv :

iconv -c -f utf-8 -t ascii input_file.csv

O sinalizador -f ( de ) especifica um formato de entrada, o sinalizador -t ( para ) especifica um formato de saída e o sinal -c indica iconv para descartar caracteres que não podem ser convertidos no destino. Isso grava os resultados na saída padrão (ou seja, no seu console). Se você quiser gravar os resultados em um novo arquivo, você faria algo assim:

iconv -c -f utf-8 -t ascii input_file.csv -o output_file.csv

Então, se você quiser, pode substituir o arquivo original pelo novo arquivo:

mv -i output_file.csv input_file.csv

Veja como iconv manipula sua primeira string de exemplo:

$ echo "'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'" | iconv -c -f utf8 -t ascii
'W' , '', ''

tr (traduzir)

Aqui está uma solução usando o comando tr (translate) :

cat input_file.csv | tr -cd '
cat input_file.csv | tr -cd '
$ echo "'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'" | tr -cd '
sed 's/[\d128-\d255]//g' input_file.csv
0-7' 'W' , '', ''
0-7' > output_file.csv
0-7'

O padrão -c0-7 especifica o intervalo numérico 0-127 usando a notação octal . Este é o intervalo de valores para caracteres ASCII. O sinal tr informa -d para corresponder valores no complemento desse intervalo (ou seja, para corresponder a caracteres não-ASCII) e o tr sinalizador informa tr executar exclusão (em vez de conversão).

Para gravar os resultados em um arquivo, use o redirecionamento de saída :

sed -i 's/[\d128-\d255]//g' input_file.csv

Veja como sed manipula sua primeira string de exemplo:

$ echo "'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'" | sed 's/[\d128-\d255]//g'
'W' , '', ''

s (editor de fluxo)

Aqui está uma solução usando sed :

iconv -c -f utf-8 -t ascii input_file.csv

O prefixo sed informa g para realizar a substituição, o sufixo sed informa [\d128-\d255] para corresponder padrões globalmente (por padrão, apenas a primeira ocorrência é correspondida), o padrão sed informa sed para corresponder caracteres com valores decimais no intervalo 128-255 (ou seja, caracteres não-ASCII), e a seqüência vazia entre a segunda e terceira barras diretas diz a sed para substituir padrões combinados com a seqüência vazia (ou seja, removê-los).

Ao contrário de muitos outros programas, sed tem uma opção para atualizar o arquivo no local (em vez de gravar manualmente em um arquivo diferente e depois substituir o original):

iconv -c -f utf-8 -t ascii input_file.csv -o output_file.csv

Veja como %code% manipula sua primeira string de exemplo:

mv -i output_file.csv input_file.csv
    
por 07.11.2017 / 11:00