Как разбить большой 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 для каждого файла из директории. Обратите внимание, что наш исходный файл также будет под влиянием данной команды.
added_csv_extension.jpg 63.1 КБ


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

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


Разбитие 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]]