Removendo certos campos de um arquivo CSV

0

Eu tenho um arquivo CSV grande (~ 15 GB) que um cliente enviou como uma exportação de uma tabela. O formato é o seguinte:

field, ... , field, field which sometimes contains commas,
another field which sometimes contains commas, field, ... , field

Consequentemente, não consigo importar os dados por causa do deslocamento produzido em algumas linhas em que os campos contêm uma ou mais vírgulas.

Eu não preciso dos dados nesses dois campos, portanto, livrar-se deles provavelmente seria a melhor opção. Consequentemente, para evitar os dois campos no meio que causam problemas, eu estava pensando em algo que para cada linha levaria os primeiros 9 campos (os antes dos dois) e os últimos 57 campos (os depois dos dois). / p>

Suponho que isso é algo que pode ser feito com sed ou awk , mas minha experiência com essas ferramentas (ou qualquer outra que seja melhor) é bastante limitada.

    
por user1608941 07.02.2014 / 23:35

4 respostas

1

Para obter os campos de que você precisa com awk :

awk -F,   '{for (i=1 ;i<NF;i++)if(i<10 || i>NF-56) printf "%s" , $i","}
           {print $NF}
    ' your_file > new_file
    
por 07.02.2014 / 23:37
0

Usando o Perl:

$ perl -F, -wane 'print "$F[0],$F[-1]"' your_file > new_file 

Além disso, você pode usar sed , já que não se importa com nada no meio, que é essencialmente tudo entre as duas vírgulas externas, você pode fazer isso:

$ sed 's/,.*,/,/g' your_file > new_file
    
por 07.02.2014 / 23:49
0

Os primeiros 9 campos e os últimos 57 campos

perl -F, -ane 'BEGIN {$,=","} print @F[0..9], @F[-57..-1]' file > newfile
    
por 08.02.2014 / 00:58
0

Não foi possível resistir: aqui está um script Python (2.7) que lê a entrada e grava as linhas modificadas de volta na saída:

try:
    while True:
        line = raw_input()
        parts = line.split(',')
        newLine = ','.join(parts[:9]) + ',' + ','.join(parts[-57:])
        print newLine
except EOFError:
    pass

Você pode salvá-lo em um arquivo como csvmod.py e executar cat input.csv | python csvmod.py > output.csv ou, se estiver procurando algo um pouco menos legível, poderá usar a seguinte linha:

cat input.csv | python -c "exec(\"try:\n while True:\n  line = raw_input()\n  parts = line.split(',')\n  newLine = ','.join(parts[:9]) + ',' + ','.join(parts[-57:])\n  print newLine\nexcept EOFError:\n pass\n\")" > output.csv

Eu acho que para uma solução Python 3 você só precisa substituir o raw_input por input .

    
por 09.02.2014 / 16:19

Tags