web-dev-qa-db-fra.com

Comment lire les données du fichier csv et les stocker dans la base de données? Spring Boot

Par exemple, j'ai une entité d'utilisateurs composée d'un nom d'utilisateur, d'un numéro de téléphone et d'une adresse. Je veux lire tous ces champs d'un fichier csv et le stocker dans la table respective de la base de données?

Quelqu'un peut-il m'aider en décrivant comment faire cela? Ou existe-t-il une documentation sur la façon de procéder?

8
Guneet

Je suppose que vous souhaitez que l'utilisateur télécharge le fichier à partir d'une interface utilisateur. Selon la manière exacte dont vous créez l'interface utilisateur, vous pouvez:

L'un ou l'autre des deux peut être résolu assez facilement en utilisant Spring.

En supposant que nous avons l'entité suivante:

@Data
@Entity
public class User {
    @Id
    private String username;
    private String phoneNumber;
    private String address;
}

Et nous définissons un référentiel Spring Data pour accéder à la base de données:

public interface UserRepository extends Repository<User, String> {
    void saveAll(List<User> users);
}

Pour la désérialisation CSV, je proposerais d'utiliser Jackson. Spring Boot est déjà livré avec Jackson, mais nous devons ajouter une extension de format de données pour CSV dans votre pom:

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-csv</artifactId>
    </dependency>

De cette façon, nous pouvons créer une méthode utilitaire simple qui sait lire un CSV pour une classe POJO donnée:

public class CsvUtils {
    private static final CsvMapper mapper = new CsvMapper();
    public static <T> List<T> read(Class<T> clazz, InputStream stream) throws IOException {
        CsvSchema schema = mapper.schemaFor(clazz).withHeader().withColumnReordering(true);
        ObjectReader reader = mapper.readerFor(clazz).with(schema);
        return reader.<T>readValues(stream).readAll();
    }
}

Et puis nous créons un contrôleur de repos simple pour gérer les téléchargements:

@RestController
public class UserController {
    private final UserRepository repository;

    public UserController(UserRepository repository) {
        this.repository = repository;
    }

    @PostMapping(value = "/upload", consumes = "text/csv")
    public void uploadSimple(@RequestBody InputStream body) {
        repository.saveAll(CsvUtils.read(User.class, body);
    }

    @PostMapping(value = "/upload", consumes = "multipart/form-data")
    public void uploadMultipart(@RequestParam("file") MultipartFile file) {
        repository.saveAll(CsvUtils.read(User.class, file.getInputStream());
    }
}

Dans le cas où vous avez également besoin de code HTML pour effectuer le téléchargement, l'extrait de code suivant est un exemple de travail minimal:

<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" id="file" />
    <input type="submit" name="submit" value="Submit" />
</form>
20
Serban Petrescu

Vous pouvez y parvenir facilement avec openCSV. Pour un utilisateur POJO connu, il vous suffit de mapper les colonnes CSV (en-têtes dans votre cas) aux champs correspondants dans le POJO.

Ajoutez simplement ce qui suit à votre dépendance, vérifiez la dernière version de votre application.

<dependency> 
<groupId>com.opencsv</groupId> 
<artifactId>opencsv</artifactId> 
<version>4.1</version> 
</dependency> 

ce lien vous guide à travers https://www.geeksforgeeks.org/mapping-csv-to-javabeans-using-opencsv/

0
Integral Master