Bibliothèque Java CSV "opencsv"

J'ai recherché et utilisé la bibliothèque Java CSV dans mon entreprise, je vais donc la résumer sous forme de mémorandum.

Liste des bibliothèques Java CSV (à partir de janvier 2018)

Les bibliothèques CSV en Java sont les suivantes.

Cette fois, j'ai utilisé opencsv.

environnement

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.

Chose que tu veux faire

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.

Préparation

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.

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;
}

CSV lu

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.

Sortie CSV

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.

Exemple de code et résultat d'exécution

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

Bibliothèque Java CSV "opencsv"
Bibliothèque CSV Android
Bibliothèque de mesures de couverture Java
Bibliothèque de mappage d'objets JAVA
Bibliothèque de cartes bidirectionnelles Java
Bibliothèque d'arborescence Java
Sortie de fichier csv avec csv ouvert
[Design pattern] Bibliothèque de base Java
Lire CSV en Java (annotation Super CSV)
Java
Bibliothèque de cache Java et politique d'éviction
Bienvenue dans le marais des bibliothèques Java! !!
Java
Appeler la bibliothèque Java à partir de C avec JNI
Bibliothèque de tests unitaires Java Artery-Easy to use
[Débutant] Méthode / classe / bibliothèque externe Java [Note 23]
[Java] Utiliser la technologie cryptographique avec les bibliothèques standard
[Java] Lecture et écriture de fichiers avec OpenCSV
Bibliothèque recommandée Java 2018 pour créer facilement des micro-services
[Java] Créons une bibliothèque d'accès à la base de données!