OpenCSV 소개

1. 소개

이 빠른 기사에서는 .csv 파일 을 작성, 읽기, 직렬화, 역 직렬화 및 / 또는 구문 분석하기위한 환상적인 라이브러리 인 OpenCSV 4를 소개 합니다! 아래에서는 OpenCSV 4를 설정하고 사용하는 방법을 보여주는 몇 가지 예를 살펴 보겠습니다.

2. 설정

pom.xml 종속성 을 통해 프로젝트에 OpenCSV를 추가하는 방법은 다음과 같습니다 .

 com.opencsv opencsv 4.1  

및 .jar OpenCSV에 대한이 공식 사이트에서 또는 메이븐 저장소에서 이상 빠른 검색을 통해 찾을 수 있습니다.

우리 를 .csv 파일은 우리가 두 개의 열과 네 개의 행으로하겠습니다 정말 간단합니다 :

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

3. 콩으로 또는 콩으로

OpenCSV를 pom.xml에 추가 한 후 두 가지 편리한 방법으로 CSV 처리 방법을 구현할 수 있습니다.

  1. 편리한 CSVReaderCSVWriter 개체 사용 (간단한 작업용) 또는
  2. CsvToBean 을 사용하여 .csv 파일을 빈 으로 변환 합니다 (주석이 달린 plain-old-java-objects 로 구현 됨 ).

이 기사에서는 동기식 (또는 차단 ) 예제를 고수 하여 기본 사항에 집중할 수 있습니다.

기억 동기 방지 할 방법 주변 또는 완료 될 때까지 실행에서 다음 코드입니다. 모든 프로덕션 환경은 비동기 메서드가 완료되는 동안 다른 프로세스 나 메서드가 완료 될 수 있도록 하는 비동기 또는 ( 비 차단 ) 메서드를 사용 합니다.

우리는에 뛰어 것이다 비동기 미래의 기사에서 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(); }

마찬가지로 제공된 .csv를 한 줄씩 읽는 readNext ()를 추상화 할 수 있습니다 .

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를 사용하여 사용자 지정 열 구분 기호를 선택하고, 따옴표를 무시하거나 처리하고, null 필드를 처리하는 방법 및 이스케이프 된 문자를 해석하는 방법을 지정할 수 있습니다. 이러한 구성 설정에 대한 자세한 내용은 공식 사양 문서를 참조하십시오.

항상 그렇듯이 메모리 누수를 방지하기 위해 모든 리더 를 닫는 것을 잊지 마십시오 !

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을 A의 전달하여 모두 한 번에 목록문자열 우리의 행을 나타내는 배열 .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 Bean 으로 구현 된 사전 설정 및 재사용 가능한 스키마로 직렬화 할 수 있습니다. CsvToBean을 사용하여 구성되어 CsvToBeanBuilder을 . OpenCSV 4부터 CsvToBeanBuildercom.opencsv.bean.CsvToBean 과 함께 작업하는 데 권장되는 방법 입니다.

다음 은 섹션 2 에서 2 열 .csv 를 직렬화하는 데 사용할 수있는 간단한 빈입니다 .

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

.csv 파일의 각 열 은 Bean의 필드와 연관됩니다. .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을 사용하여 동 기적으로 반환 된 List 를 추상화합시다 .

 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는 , 콩을 사용 CSVReaderCSVWriter . 여기에서 공식 문서를 확인하세요.

항상 그렇듯이 코드 샘플은 GitHub에서 제공됩니다.