2013-12-21 5 views
45

У меня есть файл CSV (около 10 000 строк, каждая строка содержит 300 столбцов), хранящихся на сервере LINUX. Я хочу разбить этот CSV-файл на 500 файлов CSV по 20 записей. (Каждый из них имеет тот же заголовок CSV, что и в исходном CSV)Как разбить CSV-файлы в соответствии с указанным количеством строк?

Есть ли какая-нибудь команда linux, чтобы помочь в этом преобразовании?

+0

Это действительно работает, однако заголовок первого файла будет дублироваться, что даст первый заголовок csv-файла 2. – rickman

ответ

45

Это работает:

tail -n +2 file.txt | split -l 20 - split_ 
for file in split_* 
do 
    head -n 1 file.txt > tmp_file 
    cat $file >> tmp_file 
    mv -f tmp_file $file 
done 

Найдено по: http://edmondscommerce.github.io/linux/linux-split-file-eg-csv-and-keep-header-row.html

+1

Можете ли вы объяснить, как это работает? Я проверил исходное сообщение, но также нет никаких объяснений, и даже вариант публикации комментариев. – shashi009

+4

Что делать, если ячейка в CSV содержит новую строку? –

+0

Что это за символ новой строки? Он по-прежнему работает на меня, на UTF-8, не уверен, что это помогает. – owyongsk

85

Используйте Linux расколоть команду:

split -l 20 file.txt new  

Разделить файл «file.txt» в файлы, начинающиеся с именем «новые» каждая из которых содержит 20 строк текста каждого.

Тип man split в приглашении Unix для получения дополнительной информации. Однако вам сначала нужно удалить заголовок из файла file.txt (например, с помощью команды tail), а затем добавить его обратно в каждый из разделенных файлов.

+0

Хорошие данные с примером ссылки :: https://kb.iu.edu/d/afar – user2663609

+0

Как пропустить строку first.txt file.txt? – forkfork

+0

используйте 'wc -l', чтобы получить количество строк, затем возьмите это значение, вычитайте 1 (предположим, что' wc -l' дал 50), а затем запустите 'tail -n 49' (в этом примере), чтобы получить все, кроме строка заголовка. Обратите внимание, что 'wc -l' подсчитывает символов, поэтому, если последняя строка не заканчивается символом новой строки, вы будете отключены на 1 в вашем количестве строк. –

10

Это должно сделать это для вас - все ваши файлы будут в конечном итоге называется Part1-Part500.

#!/bin/bash 
FILENAME=10000.csv 
HDR=$(head -1 $FILENAME) # Pick up CSV header line to apply to each file 
split -l 20 $FILENAME xyz # Split the file into chunks of 20 lines each 
n=1 
for f in xyz*    # Go through all newly created chunks 
do 
    echo $HDR > Part${n} # Write out header to new file called "Part(n)" 
    cat $f >> Part${n}  # Add in the 20 lines from the "split" command 
    rm $f     # Remove temporary file 
    ((n++))     # Increment name of output part 
done 
+0

Это создало файлы, но вкладки (я имею в виду \ t) были заменены пробелами, а мои файлы CSV использовали \ t как разделитель – AmineG

+0

Это можно немного улучшить, заполнив номера, чтобы файлы отображались последовательно автоматически. Заменяя $ {n} на $ (printf "% 05d \ n" $ n) –

+1

Строка заголовка дублируется в первом файле. –

2

Это должно работать !!!

file_name = Название файла, который вы хотите разделить.
10000 = Количество строк, каждый разделить файл будет содержать
file_part_ = Префикса расщепленного имени файла (file_part_0, file_part_1, file_part_2..etc продолжается)

Раскол -d -l 10000 file_name.csv file_part_

Смежные вопросы