Введение
Репозиторий GitHub: https://github.com/JuliaData/CSV.jl
Добро пожаловать в CSV.jl! Это написанный исключительно на Julia пакет для работы с текстовыми данными с разделителями, будь то разделитель-запятая (CSV), разделитель-символ табуляции (TSV) или иной символ.
Обзор
Для начала давайте обсудим высокоуровневые возможности, предоставляемые пакетом, чтобы в дальнейшем вы могли обратиться к более узконаправленной документации в зависимости от ваших потребностей:
-
CSV.File
: наиболее часто применяемая функция для приема данных с разделителями; считывает весь набор или вектор входных данных, определяя количество столбцов и строк, а также тип данных в каждом столбце. Возвращает объектCSV.File
, который представляет собой упрощенную таблицу или фрейм данных. Еслиfile
— это переменная, содержащая объектCSV.File
, к отдельным столбцам можно обращаться так:file.col1
,file[:col1]
илиfile["col"]
. Обратиться к именам проанализированных столбцов можно посредствомfile.names
. ОбъектCSV.File
также допускает перебор элементов, причем при каждой итерации получается объектCSV.Row
, а к каждому значению в строке можно обратиться в формеrow.col1
,row[:col1]
илиrow[1]
.CSV.File
также допускает обращение по индексам напрямую, напримерfile[1]
. При этом возвращается вся строкаCSV.Row
по указанному индексу (номеру строки). Если размер входных данных достаточно велик, для их анализа применяется несколько потоков и в памяти выделяются буферы для размещения всех проанализированных столбцов. ОбъектCSV.File
соответствует «исходному» интерфейсу Tables.jl и поэтому может передаваться в допустимые функции-приемники, такие какDataFrame
,SQLite.load!
,Arrow.write
и т. д. Поддерживается ряд именованных аргументов, управляющих ходом анализа, типами столбцов и другими метаданными файлов. -
CSV.read
: удобная функция, идентичнаяCSV.File
, но применяемая в том случае, когдаCSV.File
передается непосредственно в функцию-приемник, напримерDataFrame
. В некоторых случаях функции-приемники могут создавать копии поступающих данных в целях безопасности; при вызовеCSV.read(file, DataFrame)
копии анализируемого объектаCSV.File
не создаются, и функцияDataFrame
получает непосредственный контроль над столбцами объектаCSV.File
. Такой вариант эффективнее, чем вызовCSV.File(file) |> DataFrame
, который приводит к созданию дополнительной копии каждого столбца. Именованные аргументы такие же, как уCSV.File
. Вторым аргументом можно передать любую допустимую функцию-приемник или табличный тип из Tables.jl. Как и в случае сCSV.File
, первым аргументом можно передать вектор наборов входных данных, в результате чего получится одна «длинная» таблица со всеми входными данными, объединенными по вертикали. Все наборы входных данных должны иметь одинаковую схему (имена и типы столбцов). -
CSV.Rows
: альтернативный подход к приему данных с разделителями. Входные данные принимаются построчно, что позволяет передавать их в «потоковом режиме» с меньшим потреблением памяти, чем при использованииCSV.File
. При этом поддерживаются многие из параметровCSV.File
, лишь немного отличается обработка типов столбцов. По умолчанию каждый столбец имеет типUnion{Missing, String}
, то есть типы столбцов не определяются автоматически, однако их можно задать вручную. Многопоточность при анализе не применяется. После создания объектаCSV.Rows
строки можно передавать в «потоковом режиме» путем перебора элементов, причем в каждой итерации создается объектCSV.Row2
, который аналогичен типуCSV.Row
объектаCSV.File
: к отдельным значениям в строке можно обращаться в формеrow.col1
,row[:col1]
илиrow[1]
. Если каждая строка обрабатывается отдельно, то чтобы сэкономить память, можно передать аргументreusebuffer=true
. Он означает, что в памяти размещается лишь один буфер, который будет содержать значения только строки из текущей итерации.CSV.Rows
также поддерживает интерфейс Tables.jl и может передаваться в допустимые функции-приемники. -
CSV.Chunks
: эта функция аналогичнаCSV.File
, но позволяет передавать именованный аргументntasks::Integer
, чтобы разделить входной файл наntasks
фрагментов. После создания объектаCSV.Chunks
при каждой итерации возвращается объектCSV.File
со следующим анализируемым фрагментом. Это полезно для обработки очень больших файлов по частям. Так как каждый перебираемый элемент представляет собой допустимый «источник» Tables.jl,CSV.Chunks
соответствует интерфейсуTables.partitions
, поэтому в функции-приемники, которые могут обрабатывать разделы входных данных, можно передаватьCSV.Chunks
в качестве «источника». -
CSV.write
: допустимая функция-приемник Tables.jl для записи любой допустимой входной таблицы в текстовом формате с разделителями. Поддерживает множество параметров, управляющих выводом, включая разделители, символы кавычек и т. д. Данные записываются во внутренний буфер, при заполнении которого данные записываются на диск. Размер буфера настраивается. Кроме того, поддерживает запись разделенных на фрагменты входных данных в виде отдельных выходных файлов, по одному файлу на фрагмент входных данных. Например, для записиDataFrame
достаточно вызоваCSV.write("data.csv", df)
, а для записи матрицы —using Tables; CSV.write("data.csv", Tables.table(mat))
-
CSV.RowWriter
: альтернативный способ получения выходных данных CSV; принимает любой допустимый входной объект Tables.jl и при каждой итерации создает одну строку в формате CSV на основе строки из входной таблицы.
Возможностей немало! А теперь давайте перейдем к TL;DR:
-
Хотите просто прочитать файл или коллекцию файлов с разделителями и выполнить простейшие операции с данными? Используйте
CSV.File(file)
илиCSV.read(file, DataFrame)
. -
Нужны не все данные или хотите передавать большой файл в построчном режиме? Используйте
CSV.Rows
. -
Хотите обработать большой файл по частям? Используйте
CSV.Chunks
. -
Нужно получить на выходе данные в формате CSV? Используйте
CSV.write
. -
Хотите перебрать входную таблицу и получить отдельные строки в формате CSV?
CSV.RowWriter
.
Остальная часть руководства состоит из двух больших разделов: Чтение и Запись, в которых последовательно разбираются различные параметры функций CSV.File
, CSV.read
, CSV.Rows
, CSV.Chunks
, CSV.write
и CSV.RowWriter
.