Ich habe die Java CSV-Bibliothek in meinem Unternehmen gesucht und verwendet, daher werde ich sie als Memorandum zusammenfassen.
Die CSV-Bibliotheken in Java lauten wie folgt.
Diesmal habe ich opencsv verwendet.
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.
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.
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.
@ CsvBindByName
Headerspalten und -felder zuordnen@ CsvBindByPosition
Ordnen Sie die Eingabereihenfolge dem Feld zu (diesmal ausschließen, da es einen Header hat).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;
}
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.
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.
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