Remover colunas de um arquivo CSV

2

Eu tenho um arquivo CSV do qual eu preciso remover uma coluna dele. O problema é que eu exportei o arquivo CSV sem cabeçalhos. Então, como posso remover a coluna do arquivo CSV? Por exemplo, se eu tiver o < strong> example.csv Eu quero remover a última coluna dele que é um dado booleano e ter o arquivo como input.csv .

input.csv

1,"data",100.00,TRUE
2,"code",91.8,TRUE
3,"analytics",100.00,TRUE

output.csv

1,"data",100.00
2,"code",91.8
3,"analytics",100.00
    
por priyanka3 19.10.2016 / 07:47

7 respostas

12

Para remover a quarta coluna,

$ cut -d, -f4 --complement example.csv > input.csv

Ajuste a opção -f para corresponder ao número da coluna.

Se o arquivo CSV for mais complicado, você pode usar algum perl e o pacote Text :: CSV,

$ perl -MText::CSV -E '$csv = Text::CSV->new({binary=>1}); 
  while ($row = $csv->getline(STDIN)) 
  {
    print "$row->[0],$row->[1],$row->[2]\n"
  }' < example.csv > input.csv
    
por 19.10.2016 / 08:03
3

sed :

sed 's/,[^,]\+$//' file.csv
  • ,[^,]\+ corresponde , seguido por qualquer número de caracteres, exceto , , e a correspondência é substituída por uma string vazia

awk :

awk -F, '{for(i=1; i<NF; i++) printf("%s%s", $i, FS); print ""}' file.csv
  • -F, define o delimitador de campo como ,

  • for(i=1; i<NF; i++) printf("%s", $i); print "" itera nos campos, exceto o último, e imprime a saída no formato desejado

Exemplo:

% cat file.txt
1,"data",100.00,TRUE
2,"code",91.8,TRUE
3,"analytics",100.00,TRUE

% sed 's/,[^,]\+$//' file.txt                                     
1,"data",100.00
2,"code",91.8
3,"analytics",100.00

% awk -F, '{for(i=1; i<NF; i++) printf("%s%s", $i, FS); print ""}' file.txt
1,"data",100.00,
2,"code",91.8,
3,"analytics",100.00,
    
por 19.10.2016 / 08:13
3

Use o módulo csv no Python:

python -c 'import sys,csv
w = csv.writer(sys.stdout)
for row in csv.reader(sys.stdin):
    w.writerow(row[0:-1])' < input.csv > output.csv

Se você quiser que a saída contenha colunas 2, 3 e 1, nessa ordem, use

python -c 'import sys,csv
w = csv.writer(sys.stdout)
for row in csv.reader(sys.stdin):
    w.writerow([row[1], row[2], row[0]])' < input.csv > output.csv

Índices de matriz Python começam em 0, então os números das colunas são contados começando em zero também, acima; é por isso que eles são 1, 2, 0 para as colunas 2, 3, 1, respectivamente.

    
por 19.10.2016 / 10:01
1

O formato CSV às vezes é complicado: os analisadores de CSV são o caminho a seguir.

Adotando a abordagem simplista, removendo o último campo:

1) remover o último campo com Awk

awk 'BEGIN{FS=OFS=","}{NF--;print}'

2) regex com perl

perl -pe 's/.*\K,.*//'
    
por 19.10.2016 / 10:20
0

apenas altere o número da coluna neste comando awk. Abaixo o comando remove a terceira coluna. ($ 3)

awk -F, '{$3=""}1' OFS=, test.txt  | sed "s/^,//;s/,$//;s/,,/,/"
    
por 19.10.2016 / 08:26
0
cut -d "," -f 4 --complement input.csv > output.csv

Aqui, -d é seguido pelo delimitador, isto é, ponto e vírgula (;) entre aspas duplas, e -f é seguido pelo número da coluna a ser removida, ou seja, 4. Os números das colunas começam a partir de 1 e prosseguem neste contexto.

    
por 29.09.2018 / 10:38
0

Solução muito genérica para remover o número dos últimos caracteres:

awk '{print substr($0, 1, length($0)-5)}' list1.txt
1,"data",100.00
2,"code",91.8
3,"analytics",100.00

-5 é o número de caracteres que serão removidos

    
por 29.09.2018 / 11:49