Como dividir arquivos CSV conforme o número de linhas especificado?

2

Eu tenho um arquivo CSV (cerca de 10.000 linhas; cada linha tem 300 colunas) armazenada no servidor LINUX. Eu quero quebrar esse arquivo CSV em 500 arquivos CSV de 20 registros cada. (Cada um com o mesmo cabeçalho CSV presente no CSV original)

Existe algum comando do Linux para ajudar nessa conversão?

    
por Pawan Mude 21.12.2013 / 17:33

5 respostas

2

Por questões de integridade, aqui estão algumas pequenas melhorias:

  • Você pode salvar o cabeçalho uma vez e reutilizá-lo várias vezes
  • Você pode inserir o cabeçalho nos arquivos divididos usando sed sem arquivos temporários

Assim:

header=$(head -n 1 file.csv)
tail -n +2 file.csv | split -l 20
for file in x??; do
    sed -i -e 1i$'\\n'"$header" "$file"
done

O $'\\n' é um caractere NEWLINE que escapou com uma barra invertida. A expressão sed significa: insira $header antes da primeira linha.

    
por 29.12.2013 / 00:22
1

Isso deve ser feito sem o cabeçalho CSV:

tail -n +2 file.csv | split -l 20

Você pode adicionar o cabeçalho a cada um dos arquivos:

for file in x*
do
    (head -n 1 file.csv; cat "$file") > "$file".new
    mv "$file".new "$file" # Stolen from @PawanMude's answer
done
    
por 21.12.2013 / 18:39
1

Tente:

fn="infile" c=0
{ 
  read header
  split -a 3 -l 3 - "$fn"
  for f in "$fn"???; do
    c=$((c+1))
    printf "%s\n" "$header" | cat - "$f" > "${f%???}-$c" && rm "$f"
  done 
} < $fn

Ou tente com o awk:

awk 'NR==1{h=$0; next} !((NR-2)%n){close(f); f=FILENAME "-" ++c; print h>f}{print>f}' n=3 infile

versão multilinha:

awk '
  NR==1 {
    h=$0
    next
  }
  !((NR-2)%n) {
    close(f)
    f=FILENAME "-" ++c
    print h>f
  }
  {
    print>f
  }
' n=3 infile
    
por 21.12.2013 / 23:25
0

Melhor maneira de resolver isso usando o POST mencionado abaixo:

Solução

    tail -n +2 file.txt | split -l 4 - split_
for file in split_*
do
    head -n 1 file.txt > tmp_file
    cat $file >> tmp_file
    mv -f tmp_file $file
done
    
por 21.12.2013 / 18:43
0

Use o Paralelo GNU:

cat bigfile.csv | parallel -N20 --header : --pipe 'cat > {#}'

Se você precisa executar um comando em cada uma das partes, então o GNU Parallel também pode ajudar:

cat bigfile.csv | parallel -N20 --header : --pipe my_program_reading_from_stdin

cat bigfile.csv | parallel -N20 --header : --pipe --cat my_program_reading_from_a_file {}
    
por 22.02.2018 / 14:42