Введение
Репозиторий 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.