Документация Engee

Введение

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