Как разбить большой CSV-файл на несколько более мелких в macOS?

При работе с большими файлами CSV, можно столкнуться с зависаниями программ или даже операционной системы. При обработке таких файлов при помощи самописных скриптов, также возникнет проблема большого потребления оперативной памяти.

CSV-файл до разбития на более мелкие части


Для упрощения работы с данными - можно воспользоваться следующими методами разбития CSV:
  • разбитие по количеству строк в файле;
  • разбитие по размеру файла;

Разбитие CSV файла по количеству строк:

split -l 100 data.csv

Команда split разобьет выбранный csv-файл (data.csv в примере). При помощи -l 100 мы указываем, что хотим разбивать файл каждые 100 строк. Последний созданный файл будет содержать количество строк, которое останется (не более 100, в зависимости от количества строк в исходном файле). Имена новым файлам даются автоматически.

Разбитый CSV файл при помощи split -l 100 filename.csv


Можно заметить, что созданные файлы не имеют расширения *.csv. Чтобы исправить это, выполним следующую команду в терминале:

for i in *; do mv "$i" "$i.csv"; done

Эта команда проставит расширение .csv для каждого файла из директории. Обратите внимание, что наш исходный файл также будет под влиянием данной команды.


Также стоит отметить, что размер последнего файла зависит от того, сколько строк осталось.

Размер полученных файлов


Разбитие CSV файла по размеру файла:

split -b 1m large_db.csv

В этой команде -b говорит о том, что мы хотим разбивать файлы по байтам. За ним следует аргумент 1m (1 миллион байтов). В результате выполнения этой команды мы получим файлы размером 1 мегабайт каждый:

Файлы по 1мб

Если исходный CSV-файл слишком большой - количества генерированных имен для файлов будет недостаточно и выполнение команды прервется:

split -b 1m large_db.csv

split: too many files

Для этого нам нужно либо увеличить размер файлов/увеличить количество строк в них. Либо же добавить параметр suffix-length, который сделает имена получаемых файлов длиннее:

split -b 1m -a 10 large_db.csv

suffix-length


Добавляем -a и задаем длину названия файла. Все довольно просто.

При выполнении split команды будьте внимательны:
  • убедитесь что используя терминал вы перешли в нужную директорию;
  • сделайте резервную копию исходного файла;
  • помните, что выполняя команду массового переименования файлов (добавления csv расширения) - команда повлияет на все файлы в текущей директории.

Формат команды split:

split [-a suffix-length] [-b num-bytes [k|m]|-l num-lines] [input-path-name [prefix]]