Java CSV Bibliothek "opencsv"

Ich habe die Java CSV-Bibliothek in meinem Unternehmen gesucht und verwendet, daher werde ich sie als Memorandum zusammenfassen.

Liste der Java CSV-Bibliotheken (Stand Januar 2018)

Die CSV-Bibliotheken in Java lauten wie folgt.

Diesmal habe ich opencsv verwendet.

Umgebung

opencsv 4 ist kompatibel mit Java7 oder höher. Beachten Sie außerdem, dass die Verwendung zwischen opencs v3.x und opencs v4.x unterschiedlich ist.

Was du machen willst

Lesen Sie die CSV-Datei (item.csv) mit dem folgenden Inhalt und geben Sie sie aus.

item.csv


"Produkt ID","Produktname","Stückpreis","Menge"
001,"Kartoffelchips",150,50
002,"Schokolade",100,30
003,"Eis",120,10

Es gibt 3 Punkte.

Vorbereitung

Fügen Sie opencsv zu Gradles Abhängigkeit hinzu. Wenn Sie die Commons-Protokollierung ausschließen, kommentieren Sie diese bitte aus. Ich bekomme zur Laufzeit eine Ausnahme.

build.gradle


    //Auskommentieren ist erforderlich, wenn die folgende Beschreibung vorliegt
   configurations {
        //all*.exclude module: 'commons-logging'
   }

    dependencies {
        compileOnly group:'org.projectlombok', name:'lombok', version:'1.16.20'
        //csv library
        implementation group:'com.opencsv', name:'opencsv', version:'4.1'
        implementation group:'commons-logging', name: 'commons-logging', version:'1.2'
    }

Bereiten Sie außerdem eine Entitätsklasse vor, die den Elementen in der CSV-Datei entspricht. Durch Hinzufügen einer Anmerkung zum Feld der Entitätsklasse werden die Entitätsklasse und die Spalte der CSV-Datei verknüpft.

Anmerkungen können je nach Erfassungsmuster aus zwei Typen ausgewählt werden.

Bei Verwendung von "@ CsvBindByName"

ItemEntity.java


package entity;

import com.opencsv.bean.CsvBindByName;

import lombok.Data;

/**
 *Entitätsklasse, die Produkte verwaltet.
 */
@Data
public class ItemEntity {

	@CsvBindByName(column = "Produkt ID", required = true)
	private String id;

	@CsvBindByName(column = "Produktname", required = true)
	private String name;

	@CsvBindByName(column = "Stückpreis", required = true)
	private int price;

	@CsvBindByName(column = "Menge", required = true)
	private int amount;
}

Bei Verwendung von @ CsvBindByPosition

ItemEntity2.java


package entity;

import com.opencsv.bean.CsvBindByPosition;

import lombok.Data;

/**
 *Entitätsklasse, die Produkte verwaltet.
 */
@Data
public class ItemEntity2 {

	@CsvBindByPosition(position = 0, required = true)
	private String id;

	@CsvBindByPosition(position = 1, required = true)
	private String name;

	@CsvBindByPosition(position = 2, required = true)
	private int price;

	@CsvBindByPosition(position = 3, required = true)
	private int amount;
}

CSV gelesen

Dies ist ein Codebeispiel zum Lesen von CSV.

ItemFileDao.java


CsvToBean<ItemEntity> csvToBean = new CsvToBeanBuilder<ItemEntity>(reader).withType(ItemEntity.class).build();
List<ItemEntity> items = csvToBean.parse();

Verwenden Sie die Klasse CsvToBeanBuilder (http://opencsv.sourceforge.net/apidocs/com/opencsv/bean/CsvToBeanBuilder.html). Rufen Sie unbedingt die Methode "CsvToBeanBuilder # withType" oder die Methode "CsvToBeanBuilder # withMappingStrategy" auf. Verwenden Sie die Methode CsvToBeanBuilder # withSeparator, um ein Trennzeichen anzugeben.

Das Codebeispiel verwendet die Entity-Klasse mit "@ CsvBindByName". Für Entitätsklassen, die "@ CsvBindByPosition" verwenden, können ähnliche Ergebnisse ohne den Header erhalten werden.

CSV-Ausgabe

Dies ist ein Codebeispiel für die CSV-Ausgabe.

ItemFileDao.java


StatefulBeanToCsv<ItemEntity> beanToCsv = new StatefulBeanToCsvBuilder<ItemEntity>(writer).build();
beanToCsv.write(beans);

Verwenden Sie die Klasse StatefulBeanToCsvBuilder (http://opencsv.sourceforge.net/apidocs/com/opencsv/bean/StatefulBeanToCsvBuilder.html). Verwenden Sie die Methode CsvToBeanBuilder # withSeparator, um ein Trennzeichen anzugeben.

Wenn Sie die Entity-Klasse mit "@ CsvBindByName" verwenden, wird der Header automatisch hinzugefügt, aber die Spaltenreihenfolge scheint die Zeichencodereihenfolge (?) Des Headers zu sein. Wenn Sie die Entity-Klasse mit "@ CsvBindByPosition" verwenden, wird der Header nicht automatisch hinzugefügt.

Beispielcode und Ausführungsergebnis

ItemFileDao.java



import java.io.Reader;
import java.io.Writer;
import java.util.List;

import com.opencsv.bean.CsvToBean;
import com.opencsv.bean.CsvToBeanBuilder;
import com.opencsv.bean.StatefulBeanToCsv;
import com.opencsv.bean.StatefulBeanToCsvBuilder;
import com.opencsv.exceptions.CsvException;

/**
 *Dao-Klasse, die mit CSV-Dateien austauscht.
 */
public class ItemFileDao {

	public void write(Writer writer, List<ItemEntity> beans) throws CsvException {
		StatefulBeanToCsv<ItemEntity> beanToCsv = new StatefulBeanToCsvBuilder<ItemEntity>(writer).build();
		beanToCsv.write(beans);
	}
	public List<ItemEntity> read(Reader reader) throws CsvException {
		CsvToBean<ItemEntity> csvToBean = new CsvToBeanBuilder<ItemEntity>(reader).withType(ItemEntity.class).build();
		return csvToBean.parse();
	}
}

Main.java


import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

import com.opencsv.exceptions.CsvException;

public class Main {

	public static void main(String[] args) {

		ItemFileDao csvFileDao = new ItemFileDao();
		
		try (Reader reader = Files.newBufferedReader(Paths.get("item.csv"));
				Writer writer = Files.newBufferedWriter(Paths.get("item2.csv"));) {
			List<ItemEntity> items = csvFileDao.read(reader);
			items.forEach(System.out::println);
			csvFileDao.write(writer, items);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (CsvException e) {
			e.printStackTrace();
		}
	}
}
ItemEntity(id=001, name=Kartoffelchips, price=150, amount=50)
ItemEntity(id=002, name=Schokolade, price=100, amount=30)
ItemEntity(id=003, name=Eis, price=120, amount=10)

item2.csv


"Stückpreis","Produkt ID","Produktname","Menge"
"150","001","Kartoffelchips","50"
"100","002","Schokolade","30"
"120","003","Eis","10"

Recommended Posts

Java CSV Bibliothek "opencsv"
Android CSV-Bibliothek
Bibliothek zur Messung der Java-Abdeckung
JAVA-Objektzuordnungsbibliothek
Bidirektionale Java-Kartenbibliothek
Java-Baumstrukturbibliothek
Ausgabe einer CSV-Datei mit offener CSV
[Entwurfsmuster] Java-Kernbibliothek
Lesen Sie CSV in Java (Super CSV Annotation)
Java
Java-Cache-Bibliothek und Räumungsrichtlinie
Willkommen im Sumpf der Java-Bibliotheken! !!
Java
Rufen Sie die Java-Bibliothek von C mit JNI auf
Java Artery - Einfach zu verwendende Unit-Test-Bibliothek
[Anfänger] Java-Methode / Klasse / externe Bibliothek [Anmerkung 23]
[Java] Verwenden Sie kryptografische Technologie mit Standardbibliotheken
[Java] Lesen und Schreiben von Dateien mit OpenCSV
2018 Java Empfohlene Bibliothek zum einfachen Erstellen von Mikrodiensten
[Java] Erstellen wir eine DB-Zugriffsbibliothek!