Introdução ao OpenCSV
1. Introdução
Este artigo rápido apresenta o OpenCSV 4, uma biblioteca fantástica para escrever, ler, serializar, desserializar e / ou analisar arquivos.csv! Abaixo, veremos vários exemplos que demonstram como configurar e usar o OpenCSV 4 para seus empreendimentos.
2. Configuração
Veja como adicionar OpenCSV ao seu projeto por meio de uma dependênciapom.xml:
com.opencsv
opencsv
4.1
O.jars para OpenCSV pode ser encontrado emofficial site ou por meio de uma pesquisa rápida emMaven Repository.
Nosso arquivo.csv será muito simples, vamos mantê-lo em duas colunas e quatro linhas:
colA, ColB
A, B
C, D
G, G
G, F
3. Bean ou não Bean
Depois de adicionar OpenCSV ao seupom.xml, podemos implementar métodos de manipulação de CSV de duas maneiras convenientes:
-
usando os objetos úteisCSVReadereCSVWriter (para operações mais simples) ou
-
usandoCsvToBean para converter arquivos.csv em beans (que são implementados comoplain-old-java-objects anotados).
Continuaremos comsynchronous (oublocking) exemplos para este artigo para que possamos nos concentrar no básico.
Lembre-se, um métodosynchronous impedirá que o código adjacente ou subsequente seja executado até que seja feito. Qualquer ambiente de produção provavelmente usará métodosasynchronous ou (non-blocking) que permitirão que outros processos ou métodos sejam concluídos enquanto o métodoasynchronous termina.
Vamos mergulhar nos exemplos deasynchronous para OpenCSV em um artigo futuro.
3.1. OCSVReader
CSVReader - por meio dos métodosreadAll()ereadNext() fornecidos! Vamos dar uma olhada em como usarreadAll () de forma síncrona:
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;
}
Então, podemos chamar esse método passando umBufferedReader:
public String readAllExample() throws Exception {
Reader reader = Files.newBufferedReader(Paths.get(
ClassLoader.getSystemResource("csv/twoColumn.csv").toURI()));
return CsvReaderExamples.readAll(reader).toString();
}
Da mesma forma, podemos abstrairreadNext () que lê um.csv fornecido linha por linha:
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;
}
E podemos chamar esse método aqui, passando umBufferReader:
public String oneByOneExample() throws Exception {
Reader reader = Files.newBufferedReader(Paths.get(
ClassLoader.getSystemResource("csv/twoColumn.csv").toURI()));
return CsvReaderExamples.oneByOne(reader).toString();
}
Para maior flexibilidade e opções de configuração, você pode usarCSVReaderBuilder alternativamente:
CSVParser parser = new CSVParserBuilder()
.withSeparator(',')
.withIgnoreQuotations(true)
.build();
CSVReader csvReader = new CSVReaderBuilder(reader)
.withSkipLines(0)
.withCSVParser(parser)
.build();
CSVReaderBuilder permite pular os títulos das colunas e definir regras de análise por meio deCSVParserBuilder.
UsandoCSVParserBuilder, podemos escolher um separador de coluna personalizado, ignorar ou lidar com aspas, definir como lidaremos com campos nulos e como interpretar caracteres de escape. Para obter mais informações sobre essas configurações, consulte as especificações oficiaisdocs.
Como sempre, lembre-se de fechar todos os seusReaders para evitar vazamentos de memória!
3.2. OCSVWriter
CSVWriter fornece a capacidade de gravar em um arquivo.csv de uma vez ou linha por linha.
Vamos dar uma olhada em como escrever em.csv linha por linha:
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);
}
Agora, vamos especificar onde queremos salvar esse arquivo e chamar o método que acabamos de escrever:
public String csvWriterOneByOne() throws Exception{
Path path = Paths.get(
ClassLoader.getSystemResource("csv/writtenOneByOne.csv").toURI());
return CsvWriterExamples.csvWriterOneByOne(Helpers.fourColumnCsvString(), path);
}
Também podemos escrever nosso.csv de uma vez, passando umList deString arrays representando as linhas de nosso.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);
}
E é assim que o chamamos:
public String csvWriterAll() throws Exception {
Path path = Paths.get(
ClassLoader.getSystemResource("csv/writtenAll.csv").toURI());
return CsvWriterExamples.csvWriterAll(Helpers.fourColumnCsvString(), path);
}
É isso aí!
3.3. Leitura Baseada em Feijão
O OpenCSV é capaz de serializar arquivos.csv em esquemas predefinidos e reutilizáveis implementados como beans Javapojo anotados. CsvToBean é construído usandoCsvToBeanBuilder. No OpenCSV 4,CsvToBeanBuilder é a forma recomendada para trabalhar comcom.opencsv.bean.CsvToBean.
Aqui está um bean simples que podemos usar para serializar nosso.csv de duas colunas desection 2.:
public class SimplePositionBean {
@CsvBindByPosition(position = 0)
private String exampleColOne;
@CsvBindByPosition(position = 1)
private String exampleColTwo;
// getters and setters
}
Cada coluna no arquivo.csv está associada a um campo no bean. Os mapeamentos entre os cabeçalhos de coluna.csv podem ser executados usando as anotações@CsvBindByPosition ou@CsvBindByName que especificam um mapeamento por posição ou correspondência de sequência de cabeçalho, respectivamente.
Primeiro, vamos criar uma superclasse chamada CsvBean - isso nos permitirá reutilizar e generalizar os métodos que construiremos abaixo:
public class CsvBean { }
Um exemplo de classe filho:
public class NamedColumnBean extends CsvBean {
@CsvBindByName(column = "name")
private String name;
@CsvBindByName
private int age;
// getters and setters
}
Vamos abstrair umList retornado de forma síncrona usando oCsvToBean:
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();
}
Passamos nosso bean (clazz) e o definimos comoColumnPositionMappingStrategy. Ao fazer isso, associamos os campos de nossos grãos às respectivas colunas de nossas linhas.csv.
Podemos chamar isso aqui usando a subclasseSimplePositionBean deCsvBean que escrevemos acima:
public String simplePositionBeanExample() throws Exception {
Path path = Paths.get(
ClassLoader.getSystemResource("csv/twoColumn.csv").toURI());
return BeanExamples.beanBuilderExample(path, SimplePositionBean.class).toString();
}
ou aqui usandoNamedColumnBean – outra subclasse deCsvBean:
public String namedColumnBeanExample() throws Exception {
Path path = Paths.get(
ClassLoader.getSystemResource("csv/namedColumn.csv").toURI());
return BeanExamples.beanBuilderExample(path, NamedColumnBean.class).toString();
}
3.4. Escrita baseada em bean
Por último, vamos dar uma olhada em como usar a classeStatefulBeanToCsv para gravar em um arquivo.csv:
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);
}
Aqui, estamos especificando como delimitaremos nossos dados, que são fornecidos comoList de objetosCsvBean especificados.
Podemos então chamar nosso métodowriteCsvFromBean() depois de passar o caminho do arquivo de saída desejado:
public String writeCsvFromBeanExample() {
Path path = Paths.get(
ClassLoader.getSystemResource("csv/writtenBean.csv").toURI());
return BeanExamples.writeCsvFromBean(path);
}
4. Conclusão
Lá vamos nós - exemplos de código síncrono paraOpenCSV usando beans,CSVReader eCSVWriter. Confira os documentos oficiaishere.
Como sempre, as amostras de código são fornecidasover on GitHub.