CSV-документы #

Васильев Андрей Михайлович, 2024

Версии презентации

Стандарты для обмена данными #

Каждому разработчику доступна возможность работы с файлами:

  • В формате строкового представления
  • В формате бинарного представления

Разработчик может реализовать любую схему хранения данных

Почему стоит разработать своё представление данных:

  • Максимальная эффективность хранения данных
  • Максимальная эффективность операций чтения и записи данных
  • Дополнительная защита данных от неискушённого пользователя

Почему стоит использовать стандартные представления:

  • Средства чтения и записи доступны в виде библиотек (или части ЯП)
  • Разработчику необходимо понять только семантику данных, не форму

Coma Separated Values, CSV #

Формат CSV (значения, разделённые запятыми) чисто технически не является стандартом, т.к. не существует формального документа, описывающего его структуру

Однако данный формат явился одним из первых подходов к представлению табличных данных:

  • Представление данных является текстовым, т.е. не требует специального дорогостоящего офисного пакета
  • В каждой строке размещаются ячейки таблицы, разделённые запятыми
  • Первая строка может содержать не значения, а названия столбцов
  • Все значения ячеек — строковые, их необходимо преобразовать к корректному числовому

Пример CSV-документа #

Рассмотрим следующий пример:

Id,SideA,SideB,SideC,BorderColor,FillColor,Description
1,1,2,5,GREEN,RED,"странные данные, это неправильный треугольник"
2,2,3,5,RED,GREEN,"точки расположены на отрезке"
10,2,3,4,RED,GREEN,"обычный треугольник"
  • Первая строка содержит название столбцов
  • Следующие три строки содержат описание треугольников
  • Если в значении поля нет запятой, то оно пишется без кавычек
  • Вручную учесть все особенности будет трудно, особенно если они нигде явно не специфицированы

Библиотека kotlin-csv #

  • Исходный код библиотеки: https://github.com/jsoizo/kotlin-csv
  • Строка подключения библиотеки для шаблона: "com.jsoizo:kotlin-csv-jvm:1.10.0"
  • Распространяется под лицензией Apache 2.0, позволяющей коммерческое использование
  • Позволяет считывать данные из CSV-документов
  • Позволяет записывать данные в CSV-документы
  • Используется в рамках автоматизированной системы проверки

Чтение данных из CSV-документа #

Для чтения данных необходимо создать объект класса com.github.doyaaaaaken.kotlincsv.client.CsvReader через конструктор или функцию-помощник com.github.doyaaaaaken.kotlincsv.dsl.csvReader()

Название классов отличается от названия библиотеки, т.к. сменился ответственный разработчик

Данный объект предоставляет следующие функции:

  • readAll(): List<List<String>> — преобразует CSV-документ в список списков строк. Каждой строке входного файла соответствует список строк в результате работы функции
  • readAllWithHeader(): List<Map<String,String>> — преобразует CSV-документ в список словарей. Ключами словаря являются строки, записанные в строке-заголовке

Данные могут быть считаны из строки, файла, входного потока данных

Запись данных в CSV-документ #

Для записи данных необходимо создать объект класса com.github.doyaaaaaken.kotlincsv.client.CsvWriter через конструктор или функцию-помощник com.github.doyaaaaaken.kotlincsv.dsl.csvWriter()

Данный объект предоставляет функцию

writeAll(rows: List<List<String>>, file: File)
  • Первым аргументом указывается список строк для записи
  • Вторым аргументом указывается файл, либо название файла, либо поток вывода

Хранилище данных #

Ввиду увеличения объёма кода внутри приложения становится вопрос о выделении различных компонентов, решающих конкретные задачи

Первым таким компонентом может стать хранилище данных

  • Обеспечение чтения данных с жёсткого диска при старте приложения
  • Предоставление единого взгляда на данные внутри всего приложения
  • Реализация сохранения данных при завершении работы приложения

Для обеспечения данной функции достаточным видится следующий набор функций:

  • Считывание данных из файла, принимает путь к файлу
  • Запись данных хранилища в файл, принимает путь к файлу
  • Получение списка всех элементов из хранилища, возвращает список элементов
  • Получение конкретного элемента по идентификатору

Если в приложении несколько ключевых сущностей, то для каждой следует завести своё хранилище