Как разделить CSV-файлы в соответствии с количеством строк, указанных?

Как разделить CSV-файлы в соответствии с количеством строк, указанных?

21.12.2013 08:31:56 Просмотров 120 Источник

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

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

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified#comment74867569_20721120
Это действительно работает, однако, заголовок первого файла будет дублироваться, таким образом, давая первый csv-файл 2 заголовков.

Ответы - Как разделить CSV-файлы в соответствии с количеством строк, указанных? / How to split CSV files as per number of rows specified?

James King

21.12.2013 08:37:44

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

split -l 20 file.txt new    

Разделите файл " файл.txt "в файлы, начинающиеся с имени "new", каждый из которых содержит по 20 строк текста.

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

https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified/20721171#comment73541234_20721171
Как я могу пропустить файл?txt первая строка (заголовок)?
https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified/20721171#comment84964445_20721171
используйте wc -l, чтобы получить количество строк, затем возьмите это значение вычитания 1 (Предположим, что wc -lдал 50), а затем запустите tail -n 49(в этом примере), чтобы получить все, кроме строки заголовка. Обратите внимание, что wc -lподсчитывает символы <newline>, поэтому, если последняя строка не заканчивается символом новой строки, вы будете сбиты на 1 в вашем количестве строк.
https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified/20721171#comment84966757_20721171
@lucas, tail -n +2выведет все строки, кроме первой.
https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified/20721171#comment84996232_20721171
@JamesKing, +1 И Спасибо! Я должен читать документы более внимательно :)
https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified/20721171#comment98455092_20721171
Обратите внимание: это не будет работать правильно, если у вас есть значение столбца с новыми строками в нем (например, вы получаете от экспорта из Excel или таблиц базы данных с большими блоками текста в них).
https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified/20721171#comment101835136_20721171
для сохранить ".csv " в новых файлах просто добавьте --additional-suffix=.csv
Является ответом!
Martin Dinov

21.12.2013 08:42:19

Превратил его в функцию. Теперь вы можете вызвать splitCsv <Filename> [chunkSize]

splitCsv() {
    HEADER=$(head -1 $1)
    if [ -n "$2" ]; then
        CHUNK=$2
    else 
        CHUNK=1000
    fi
    tail -n +2 $1 | split -l $CHUNK - $1_split_
    for i in $1_split_*; do
        echo -e "$HEADER\n$(cat $i)" > $i
    done
}

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

https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified/20721203#comment62968683_20721203
Можете ли вы объяснить, как это работает ? Я проверил исходный пост, но там также нет никаких объяснений, и даже нет возможности оставлять комментарии.
https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified/20721203#comment68325403_20721203
что делать, если ячейка в CSV содержит новую строку?
https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified/20721203#comment70741483_20721203
Что это за символ новой строки? Он все еще работает для меня, на UTF-8, не уверен, что это поможет.
https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified/20721203#comment70839319_20721203
@shashi009: предположим, что исходный файл называется файлом.формат txt. 1: пропустить первую строку, а затем передать остальную часть файла в split, который разбивается на новые файлы длиной по 20 строк, с префиксом split_2: перебирать новые split_* файлы, сохраняя каждое имя в переменном file, по одному за раз 3: для каждого... 4: записать первую строку (заголовки столбцов) из нашего исходного файла в tmp_filetmp_file 5: добавить разделенный файл 20 строк в файл tmp_file6: перезаписать старый файл split_* новым файлом tmp_file, чтобы он сохранил заголовки столбцов
Mark Setchell

21.12.2013 09:42:22

Это должно сделать это за вас - все ваши файлы будут называться 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
https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified/20721779#comment56193456_20721779
Это создало файлы, но вкладки (я имею в виду \t) были заменены пробелами, и мои CSV-файлы использовали \t в качестве разделителя
https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified/20721779#comment57032704_20721779
Это можно немного улучшить, заполнив номера так, чтобы файлы отображались последовательно автоматически. Заменив ${n} на $(printf "%05d\n " $n)
https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified/20721779#comment76236208_20721779
Строка заголовка дублируется в первом файле.
Coral

08.01.2018 07:47:27

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

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

split-d-l 10000 имя_файла.КШМ file_part_

https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified/48154590#comment88818043_48154590
это работает абсолютно нормально! Есть ли способ, которым я могу ограничить количество файлов строк 10000, которые я создаю. Скажем, я просто хочу, чтобы первые 200 000 строк были разделены на 10k строк csv-файлов, а остальные игнорирую.
https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified/48154590#comment92083693_48154590
@Pronomita head -200000 file.csv | split -l 10000 - new_
https://stackoverflow.com/questions/20721120/how-to-split-csv-files-as-per-number-of-rows-specified/48154590#comment102522541_48154590
У меня был 13-гигабайтный CSV-файл с поврежденной строкой около строки ~69 000 000. Это блокировало импорт в bigquery. Это позволило мне разделить его рекурсивно, пока я не смог изолировать линию и исправить ее. Ни одно другое решение не было столь эффективным в обработке больших файлов, не приводя сервер к сбою или блокировке. Потребовалось около 2 минут, чтобы разделить файл на 5 000 000 фрагментов строк. Спасибо!
Tim Richardson

30.01.2020 04:32:40

У меня есть однострочный ответ (это дает вам 999 строк данных и одну строку заголовка на файл)

cat bigFile.csv | parallel --header : --pipe -N999 'cat >file_{#}.csv'

https://stackoverflow.com/a/53062251/401226

Помочь в развитии проекта:
Закрыть X