J'ai recherché et utilisé la bibliothèque Java CSV dans mon entreprise, je vais donc la résumer sous forme de mémorandum.
Les bibliothèques CSV en Java sont les suivantes.
Cette fois, j'ai utilisé opencsv.
opencsv 4 est compatible avec java7 ou version ultérieure. Notez également que l'utilisation est différente entre opencs v3.x et opencs v4.x.
Lisez et sortez le fichier CSV (item.csv) avec le contenu suivant.
item.csv
"ID produit","Nom du produit","Prix unitaire","quantité"
001,"Chips de pommes de terre",150,50
002,"Chocolat",100,30
003,"la glace",120,10
Il y a 3 points.
Ajoutez opencsv à la dépendance de Gradle. Si vous excluez la journalisation commune, veuillez la commenter. J'obtiens une exception au moment de l'exécution.
build.gradle
//Un commentaire est requis s'il y a la description suivante
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'
}
Préparez également une classe Entity qui correspond aux éléments du fichier CSV. En ajoutant une annotation au champ de la classe Entity, la classe Entity et la colonne du fichier CSV sont liées.
Les annotations peuvent être sélectionnées parmi deux types en fonction du modèle de capture.
@ CsvBindByName
Associer les colonnes et les champs d'en-tête@ CsvBindByPosition
Lier l'ordre d'entrée et le champ (à exclure cette fois car il a un en-tête)Lors de l'utilisation de @ CsvBindByName
ItemEntity.java
package entity;
import com.opencsv.bean.CsvBindByName;
import lombok.Data;
/**
*Classe d'entité qui gère les produits.
*/
@Data
public class ItemEntity {
@CsvBindByName(column = "ID produit", required = true)
private String id;
@CsvBindByName(column = "Nom du produit", required = true)
private String name;
@CsvBindByName(column = "Prix unitaire", required = true)
private int price;
@CsvBindByName(column = "quantité", required = true)
private int amount;
}
Lors de l'utilisation de @ CsvBindByPosition
ItemEntity2.java
package entity;
import com.opencsv.bean.CsvBindByPosition;
import lombok.Data;
/**
*Classe d'entité qui gère les produits.
*/
@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;
}
Ceci est un exemple de code pour la lecture de CSV.
ItemFileDao.java
CsvToBean<ItemEntity> csvToBean = new CsvToBeanBuilder<ItemEntity>(reader).withType(ItemEntity.class).build();
List<ItemEntity> items = csvToBean.parse();
Utilisez la classe CsvToBeanBuilder (http://opencsv.sourceforge.net/apidocs/com/opencsv/bean/CsvToBeanBuilder.html).
N'oubliez pas d'appeler la méthode CsvToBeanBuilder # withType
ou la méthode CsvToBeanBuilder # withMappingStrategy
.
Utilisez la méthode CsvToBeanBuilder # withSeparator
pour spécifier un séparateur.
L'exemple de code utilise la classe Entity avec «@ CsvBindByName».
Pour les classes Entity utilisant @ CsvBindByPosition
, des résultats similaires peuvent être obtenus sans l'en-tête.
Ceci est un exemple de code pour la sortie CSV.
ItemFileDao.java
StatefulBeanToCsv<ItemEntity> beanToCsv = new StatefulBeanToCsvBuilder<ItemEntity>(writer).build();
beanToCsv.write(beans);
Utilisez la classe StatefulBeanToCsvBuilder (http://opencsv.sourceforge.net/apidocs/com/opencsv/bean/StatefulBeanToCsvBuilder.html).
Utilisez la méthode CsvToBeanBuilder # withSeparator
pour spécifier un séparateur.
Lorsque vous utilisez la classe Entity en utilisant @ CsvBindByName
, l'en-tête est ajouté automatiquement, mais l'ordre des colonnes semble être l'ordre du code des caractères (?) De l'en-tête.
Si vous utilisez la classe Entity avec @ CsvBindByPosition
, l'en-tête ne sera pas ajouté automatiquement.
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;
/**
*Classe Dao qui échange avec des fichiers CSV.
*/
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=Chips de pommes de terre, price=150, amount=50)
ItemEntity(id=002, name=Chocolat, price=100, amount=30)
ItemEntity(id=003, name=la glace, price=120, amount=10)
item2.csv
"Prix unitaire","ID produit","Nom du produit","quantité"
"150","001","Chips de pommes de terre","50"
"100","002","Chocolat","30"
"120","003","la glace","10"
Recommended Posts