Въведение в OpenCSV

1. Въведение

Тази бърза статия представя OpenCSV 4, фантастична библиотека за писане, четене, сериализиране, десериализиране и / или анализиране на .csv файлове! По-долу ще разгледаме няколко примера, демонстриращи как да настроите и използвате OpenCSV 4 за вашите начинания.

2. Настройка

Ето как да добавите OpenCSV към вашия проект чрез зависимост pom.xml :

 com.opencsv opencsv 4.1  

На .jars за OpenCSV могат да бъдат намерени в официалния сайт или чрез бързо търсене в продължение на Maven хранилището.

Нашият .csv файл ще бъде наистина прост, ще го запазим до две колони и четири реда:

colA, ColB A, B C, D G, G G, F

3. Да боб или да не боб

След добавяне на OpenCSV към вашия pom.xml , можем да внедрим методи за обработка на CSV по два удобни начина:

  1. използване на удобните обекти CSVReader и CSVWriter (за по-прости операции) или
  2. използване на CsvToBean за конвертиране на .csv файлове в боб (които се изпълняват като анотирани обикновени-стари-java-обекти ).

Ще се придържаме към синхронни (или блокиращи ) примери за тази статия, за да можем да се съсредоточим върху основите.

Не забравяйте, че синхронният метод ще предотврати изпълнението на околния или последващия код, докато не приключи. Всяка производствена среда вероятно ще използва асинхронни или ( неблокиращи ) методи, които ще позволят на други процеси или методи да завършат, докато асинхронният метод завърши.

Ще се потопим в асинхронни примери за OpenCSV в следваща статия.

3.1. В CSVReader

CSVReader - чрез предоставените методи readAll () и readNext () ! Нека да разгледаме как да използваме readAll () синхронно:

public List readAll(Reader reader) throws Exception { CSVReader csvReader = new CSVReader(reader); List list = new ArrayList(); list = csvReader.readAll(); reader.close(); csvReader.close(); return list; }

Тогава можем да извикаме този метод, като предадем BufferedReader :

public String readAllExample() throws Exception { Reader reader = Files.newBufferedReader(Paths.get( ClassLoader.getSystemResource("csv/twoColumn.csv").toURI())); return CsvReaderExamples.readAll(reader).toString(); }

По същия начин можем да абстрахираме readNext (), който чете предоставен .csv ред по ред:

public List oneByOne(Reader reader) throws Exception { List list = new ArrayList(); CSVReader csvReader = new CSVReader(reader); String[] line; while ((line = csvReader.readNext()) != null) { list.add(line); } reader.close(); csvReader.close(); return list; }

И можем да извикаме този метод тук, като предадем BufferReader:

public String oneByOneExample() throws Exception { Reader reader = Files.newBufferedReader(Paths.get( ClassLoader.getSystemResource("csv/twoColumn.csv").toURI())); return CsvReaderExamples.oneByOne(reader).toString(); } 

За по-голяма гъвкавост и опции за конфигуриране можете алтернативно да използвате CSVReaderBuilder :

CSVParser parser = new CSVParserBuilder() .withSeparator(',') .withIgnoreQuotations(true) .build(); CSVReader csvReader = new CSVReaderBuilder(reader) .withSkipLines(0) .withCSVParser(parser) .build();

CSVReaderBuilder позволява на човек да пропусне заглавията на колоните и да зададе правила за синтактичен анализ чрез CSVParserBuilder .

Използвайки CSVParserBuilder , можем да изберем персонализиран разделител на колони, да игнорираме или да обработим кавички, да посочим как ще обработваме нулеви полета и как да интерпретираме избягали символи. За повече информация относно тези настройки на конфигурацията вижте официалните документи за спецификация.

Както винаги, не забравяйте да затворите всичките си четци, за да предотвратите изтичане на памет!

3.2. В CSVWriter

CSVWriter по същия начин предоставя възможността за запис в .csv файл наведнъж или ред по ред.

Нека да разгледаме как да пишем в .csv ред по ред:

public String csvWriterOneByOne(List stringArray, Path path) throws Exception { CSVWriter writer = new CSVWriter(new FileWriter(path.toString())); for (String[] array : stringArray) { writer.writeNext(array); } writer.close(); return Helpers.readFile(path); } 

Сега, нека да посочим къде искаме да запазим този файл и да извикаме метода, който току-що написахме:

public String csvWriterOneByOne() throws Exception{ Path path = Paths.get( ClassLoader.getSystemResource("csv/writtenOneByOne.csv").toURI()); return CsvWriterExamples.csvWriterOneByOne(Helpers.fourColumnCsvString(), path); }

Също така можем да напишем нашия .csv наведнъж, като предадем списък от масиви от низове, представляващи редовете на нашия .csv . :

public String csvWriterAll(List stringArray, Path path) throws Exception { CSVWriter writer = new CSVWriter(new FileWriter(path.toString())); writer.writeAll(stringArray); writer.close(); return Helpers.readFile(path); }

И ето как го наричаме:

public String csvWriterAll() throws Exception { Path path = Paths.get( ClassLoader.getSystemResource("csv/writtenAll.csv").toURI()); return CsvWriterExamples.csvWriterAll(Helpers.fourColumnCsvString(), path); }

Това е!

3.3. Четене на базата на боб

OpenCSV е в състояние да сериализира .csv файлове в предварително зададени и повторно използвани схеми, изпълнени като анотирани Java pojo зърна. CsvToBean е конструиран с помощта на CsvToBeanBuilder . От OpenCSV 4 CsvToBeanBuilder е препоръчителният начин за работа с com.opencsv.bean.CsvToBean.

Ето един прост боб, който можем да използваме, за да сериализираме нашата .csv от две колони от раздел 2 .:

public class SimplePositionBean { @CsvBindByPosition(position = 0) private String exampleColOne; @CsvBindByPosition(position = 1) private String exampleColTwo; // getters and setters } 

Всяка колона в .csv файла е свързана с поле в боб. Съпоставянията между .csv заглавия на колони могат да се извършват с помощта на @CsvBindByPosition или @CsvBindByName анотации, които указват съответствието съответно по позиция или заглавие.

Първо, нека създадем суперклас, наречен CsvBean - това ще ни позволи да използваме повторно и да обобщим методите, които ще изградим по-долу:

public class CsvBean { }

Примерен детски клас:

public class NamedColumnBean extends CsvBean { @CsvBindByName(column = "name") private String name; @CsvBindByName private int age; // getters and setters }

Нека абстрахираме синхронно върнат списък с помощта на CsvToBean :

 public List beanBuilderExample(Path path, Class clazz) throws Exception { CsvTransfer csvTransfer = new CsvTransfer(); ColumnPositionMappingStrategy ms = new ColumnPositionMappingStrategy(); ms.setType(clazz); Reader reader = Files.newBufferedReader(path); CsvToBean cb = new CsvToBeanBuilder(reader) .withType(clazz) .withMappingStrategy(ms) .build(); csvTransfer.setCsvList(cb.parse()); reader.close(); return csvTransfer.getCsvList(); }

We pass in our bean (clazz) and set that as the ColumnPositionMappingStrategy. In doing so, we associate the fields of our beans with the respective columns of our .csv rows.

We can call that here using the SimplePositionBean subclass of the CsvBean we wrote above:

public String simplePositionBeanExample() throws Exception { Path path = Paths.get( ClassLoader.getSystemResource("csv/twoColumn.csv").toURI()); return BeanExamples.beanBuilderExample(path, SimplePositionBean.class).toString(); }

or here using the NamedColumnBean – another subclass of the CsvBean:

public String namedColumnBeanExample() throws Exception { Path path = Paths.get( ClassLoader.getSystemResource("csv/namedColumn.csv").toURI()); return BeanExamples.beanBuilderExample(path, NamedColumnBean.class).toString(); }

3.4. Bean-Based Writing

Lastly, let's take a look at how to use the StatefulBeanToCsv class to write to a .csv file:

public String writeCsvFromBean(Path path) throws Exception { Writer writer = new FileWriter(path.toString()); StatefulBeanToCsv sbc = new StatefulBeanToCsvBuilder(writer) .withSeparator(CSVWriter.DEFAULT_SEPARATOR) .build(); List list = new ArrayList(); list.add(new WriteExampleBean("Test1", "sfdsf", "fdfd")); list.add(new WriteExampleBean("Test2", "ipso", "facto")); sbc.write(list); writer.close(); return Helpers.readFile(path); }

Here, we are specifying how we will delimit our data which is supplied as a List of specified CsvBean objects.

След това можем да извикаме нашия метод writeCsvFromBean () след преминаване в желания път на изходния файл:

public String writeCsvFromBeanExample() { Path path = Paths.get( ClassLoader.getSystemResource("csv/writtenBean.csv").toURI()); return BeanExamples.writeCsvFromBean(path); }

4. Заключение

Ето го - примери за синхронен код за OpenCSV с помощта на боб, CSVReader и CSVWriter . Вижте официалните документи тук.

Както винаги, примерните кодове се предоставят в GitHub.