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)
- Первым аргументом указывается список строк для записи
- Вторым аргументом указывается файл, либо название файла, либо поток вывода
Хранилище данных
#
Ввиду увеличения объёма кода внутри приложения становится вопрос о выделении
различных компонентов, решающих конкретные задачи
Первым таким компонентом может стать хранилище данных
- Обеспечение чтения данных с жёсткого диска при старте приложения
- Предоставление единого взгляда на данные внутри всего приложения
- Реализация сохранения данных при завершении работы приложения
Для обеспечения данной функции достаточным видится следующий набор функций:
- Считывание данных из файла, принимает путь к файлу
- Запись данных хранилища в файл, принимает путь к файлу
- Получение списка всех элементов из хранилища, возвращает список элементов
- Получение конкретного элемента по идентификатору
Если в приложении несколько ключевых сущностей, то для каждой следует завести
своё хранилище