Автор оригинала: 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 может анализировать и считывать данные в соответствующий элемент, при этом преобразование типов обрабатывается автоматически:
ListtreeParser = 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