Como editar o cabeçalho de um arquivo CSV enorme no local?

4

Eu tenho vários arquivos CSV enormes nos quais quero trocar dois nomes de colunas.

Eu faço não quero modificar / copiar / reescrever os dados.

A operação é muito barata em C : fopen o arquivo, fgets o cabeçalho, fseek ou rewind , manipula o cabeçalho ( preservando seu comprimento ), fputs o novo cabeçalho, fclose o arquivo.

Isso também pode ser feito em ANSI Common Lisp ( CLISP , SBCL ou GCL ):

 (with-open-file (csv "foo.csv" :direction :io
                      :if-exists :overwrite)
   (let ((header (read-line csv)))
     (print header)
     (file-position csv 0)
     (write-line (string-upcase header) csv)
     (file-position csv 0)
     (read-line csv)))

e leva uma fração de segundo ( sed leva alguns minutos porque lê e reescreve todo o arquivo mesmo que você diga para modificar apenas a primeira linha, ignorando a informação crucial de que o tamanho do cabeçalho não mudou

.

Como faço isso com as "ferramentas unix padrão" (por exemplo, perl )?

    
por sds 17.12.2012 / 22:17

4 respostas

3

Se você não souber o comprimento do cabeçalho, head -n1 parece ser uma maneira razoável de obter a primeira linha.

Para escrevê-lo no local de volta à cabeça do arquivo, você pode usar o dd:

head -n1 file.csv | ./do-some-processing | dd of=file.csv bs=1 conv=notrunc

o conv=notrunc é fundamental para deixar o restante do arquivo intacto e bs=1 deve parar no limite de bytes.

    
por 18.12.2012 / 16:05
1

Sugiro sed para isso, você pode especificar para fazer apenas a substituição na primeira linha, como 1s/foo/bar/ :

$ cat file
col1,col2,col3
1,2,3
3,2,1
...

$ sed -e '1s/col1/tmp/' -e '1s/col3/col1/'  -e '1s/tmp/col3/' file
col3,col2,col1
1,2,3
3,2,1
...

Use -i para armazenar a alteração no arquivo:

$ sed -i -e '1s/col1/tmp/' -e '1s/col3/col1/'  -e '1s/tmp/col3/' file
    
por 17.12.2012 / 23:53
0

Se tudo o que você quer é trocar duas palavras, então tudo que você precisa é reescrever alguns bytes.

Esta é uma tarefa fácil para um editor hexadecimal de linha de comando.

Eu recomendaria hexedit , que usei para editar um arquivo de 30 Gb .csv . O tempo gasto na abertura / salvamento do arquivo foi insignificante (menos de um segundo). Na verdade, meu tempo foi gasto principalmente procurando os atalhos de teclado ... ( TAB para alternar para exibição ASCII, Ctrl-X para salvar e sair).

    
por 22.06.2017 / 20:22
-1

Ou talvez "encabeçar" o arquivo para remover a primeira linha de um arquivo separado.

Em seguida, altere o arquivo de cabeçalho e junte os dois novamente.

    
por 17.12.2012 / 22:54

Tags