Рубрики
Без рубрики

Чтение и запись Csv на Java с помощью Opencv

Автор оригинала: Jean Fernando.

Вступление

Это заключительная статья в короткой серии , посвященной библиотекам для чтения и записи CSV на Java, и прямое продолжение предыдущей статьи – Чтение и запись CSV на Java с помощью CSV Apache Commons .

OpenCSV

OpenCSV является одним из самых простых и простых для понимания парсеров CSV, использующих стандартные классы Reader //Writer и предлагающих реализацию CSVReader сверху.

Как и файл CSV Apache Commons, OpenCSV работает с лицензией Apache 2.0. Перед загрузкой и принятием решения об использовании анализаторов Opencsv вы можете просмотреть исходный код и Javadocs и даже проверить их набор тестов JUnit, который включен в их репозиторий git.

OpenCSV также включен в MVNRepository , что упрощает управление зависимостями.

Считыватель CSV позволяет извлекать одну запись за раз, несколько записей в виде списка или итератора, что делает его гибким с точки зрения удобства использования считываемых данных. Библиотека также включает в себя удобные функции, такие как чтение, запись в компоненты и из них, а также прямое сопоставление из CSV-файла на карту Java с использованием строки заголовка.

OpenCSV не имеет такого широкого спектра предопределенных форматов, как CSV Apache Commons. Он полагается на два анализатора:

  • CSVParser – Исходный синтаксический анализатор, определенный в OpenCSV. Это работает для большинства простых экземпляров синтаксического анализа, но не работает, если в самой записи определены escape-символы.
  • RFC4180Parser – аналогично CSVFormat.RFC4180 синтаксическому анализатору в CSV-файле Apache Commons. Работает с файлами CSV, которые отформатированы в соответствии со спецификациями RFC 4180. Эта версия синтаксического анализатора рассматривает все символы между открывающими и закрывающими кавычками как содержимое, за исключением символа двойной кавычки, который необходимо экранировать другой двойной кавычкой.

Чтение CSV с помощью OpenCSV

Чтение CSV-файлов с помощью OpenCSV выполняется быстрее, чем с помощью CSV-файлов Apache Commons, поскольку CSVWriter реализован как многопоточный при использовании метода CSVToBean.parse () .

Средство чтения CSV также реализовано с использованием Java Iterable , поэтому можно управлять как ограничениями памяти, так и ограничениями по времени в зависимости от выбранного вами метода реализации.

OpenCSV имеет два типа объектов для чтения Csv – CSVReader и его подкласс CSV Reader с заголовком .

CSV-считыватель аналогичен своему аналогу CSV CSVParser Apache Commons и может использоваться как для простых, так и для сложных сценариев синтаксического анализа.

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

CSVReader csvReader = new CSVReader (new InputStreamReader(csvFile.getInputStream()));
while ((record = csvReader.readNext()) != null) {
    // do something
}

Если ваш CSV разделен символом, отличным от запятой, вы можете вместо этого использовать конструктор с двумя параметрами и указать разделитель, который вы хотите использовать в CSVReader .

Например, если ваш CSV содержит значения, разделенные вкладками, вы можете инициализировать средство чтения CSV следующим образом:

CSVReader csvReader = new CSVReader(new InputStreamReader(csvFile.getInputStream()), '\t');

OpenCSV также имеет более сложный способ анализа CSV-файлов, который включает реализацию компонентов для отображения полей в CSV, а затем использование аннотаций для идентификации типов записей с аннотациями на основе заголовка или позиции.

Это помогает, поскольку позволяет обрабатывать записи CSV как общий набор данных, а не как набор отдельных полей.

Если имена заголовков обрабатываемого файла совпадают, вы можете аннотировать столбцы с помощью аннотации @CSVBindByName и разрешить OpenCSV выполнять сопоставление и копирование при обработке проанализированных данных.

Например, с нашим набором данных дерева:

public class Trees {
    @CSVBindByName
    private int index;

    @CSVBindByName
    private int girth;

    @CSVBindByName
    private int height;

    @CSVBindByName
    private int volume;

    public int getIndex() {
        return this.index;
    }

    public void setIndex(int newIndex) {
        this.index = newIndex;
    }
    ...
}

Пока ваш CSV-файл содержит заголовок с именами переменных в нашем объявлении класса, OpenCSV может анализировать и считывать данные в соответствующий элемент, при этом преобразование типов обрабатывается автоматически:

List treeParser = new CSVToBeanBuilder(FileReader("somefile.csv")).withType(Trees.class).build().parse();

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

Если имя заголовка немного отличается от имени переменной, строку также можно задать в аннотации. Возможность сопоставления имени заголовка, когда имя столбца отличается, полезна в нашем примере, поскольку наш фактический набор данных содержит единицу измерения поля, а также пробелы и знаки препинания, которые не допускаются в стандартных именах переменных Java.

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

В этом случае флаг и отображение могут быть указаны с помощью аннотации:

...
    @CSVBindByName (column = "Girth (in)", required = true)
    private int girth;
...

Если ваш CSV-файл не имеет заголовка, вы можете сопоставить его по позиции столбца вместе с аннотацией @CSVBindByPosition .

Имейте в виду, что позиции OpenCSV основаны на 0:

public class Trees{
    @CSVBindByPosition(position = 0, required = true)
    private int index;

    @CSVBindByPosition(position = 1, required = true)
    private int girth;

    @CSVBindByPosition(position = 2)
    private int height;

    @CSVBindByPosition(position = 3)
    private int volume;
}

Если вы хотите обрабатывать более сложные сценарии, вы можете реализовать класс с интерфейсом Стратегии сопоставления и определить схему перевода или сопоставления, соответствующую вашему сценарию синтаксического анализа.

Написание CSV с помощью Opencv

OpenCSV имеет больше возможностей, чем Apache Commons CSV, когда дело доходит до записи данных в CSV-файлы. Это позволяет вам либо писать из массива строк, либо писать из списка объектов.

Запись из списка объектов требует, чтобы объекты были инициализированы и объявлены заранее. Поэтому, чтобы все было просто, давайте рассмотрим работу с массивом строк.

Для создания CSV-файла с данными из массива строк:

CSVWriter csvWriter = new CSVWriter(new FileWriter("new.csv"), ',');
String[] records = "Index.Girth.Height.Volume".split(".");
csvWriter.writeNext(records);
csvWriter.close();

OpenCSV работает с концепцией, согласно которой CSV-это не просто значения, разделенные запятыми; это позволяет вам определить, какой разделитель вы хотите использовать в файле в качестве параметра в конструкторе CSVWriter .

Аналогично, при определении массива строк может оказаться полезным объявить строку, а затем разделить ее на значения на основе разделителя. Это особенно полезно, когда вам нужно скопировать выбранное подмножество строк данных из одного CSV-файла или файла базы данных в другой.

При инициализации CSVWriter обязательна Файловая пишущая машинка или Писатель . Инициализация записи с использованием только одного параметра приводит к созданию файла, разделенного запятыми по умолчанию.

Существуют некоторые дополнительные параметры для конкретных случаев использования:

  • Разделитель символов – разделитель. Если не указано, разделителем по умолчанию будет запятая.
  • Char quotechar – символ цитаты. Это будет использоваться в случае, если ваш набор данных содержит значение с запятой как часть набора данных, и вам необходимо создать файл, разделенный запятыми. Как правило, в качестве символов кавычек используются двойные кавычки, одинарные кавычки или косые черты.
  • Символ escapechar – Обычно используется для экранирования символа цитаты .
  • Строка lineend – строка или символ, определяющий конец строки данных.

Вы можете создать файл CSV , включающий все необязательные параметры:

CSVWriter csvWriter = new CSVWriter(new FileWriter("new.csv"), ",", "'","/", "\n");

CSV-файл также содержит некоторые поля, которые вы можете передать в качестве параметров конструктору. Вы можете определить эти значения как константы и повторно использовать символы и строки в своей кодовой базе для сохранения согласованности.

Например, после объявления:

CSVWriter.DEFAULT_SEPARATOR = ",";
CSVWriter.DEFAULT_QUOTE_CHARACTER = "'";
CSVWriter.DEFAULT_ESCAPE_CHARACTER = "/";
CSVWriter.DEFAULT_LINE_END = "\n";

Вы могли бы использовать:

CSVWriter csvWriter = new CSVWriter(new FileWriter("new.csv"), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.DEFAULT_QUOTE_CHARACTER, CSVWriter.DEFAULT_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END);

Или используйте Opencv, используя значения по умолчанию, если значения явно не определены в конструкторе, и просто вызовите:

CSVWriter csvWriter = new CSVWriter(new FileWriter("new.csv"));

Поэтому, если ваши данные содержат строку с именем пользователя и адресом, например: JohnDoe, 19/2, ABC Street , Где-то , фактический формат строки, в котором он вам нужен, – это “JohnDoe”, “19//2/, АВС-стрит/, Где-то” .

Вывод

OpenCSV является одним из самых простых и простых для понимания парсеров CSV, использующих стандартные классы Reader //Writer и предлагающих реализацию CSVReader сверху.

  • Чтение и запись Csv в ядре Java
  • Чтение и запись Csv на Java с помощью Apache Commons CSV