web-dev-qa-db-ja.com

csvファイルからデータを読み取り、データベースに保存する方法は?春のブーツ

たとえば、ユーザー名、電話番号、住所で構成されるユーザーのエンティティがあります。これらすべてのフィールドをcsvファイルから読み取り、データベースのそれぞれのテーブルに保存したいですか?

誰もそれを行う方法を説明することで私を助けることができますか?または、それを行う方法に関するドキュメントはありますか?

8
Guneet

ユーザーに何らかのUIからファイルをアップロードしてほしいと思います。 UIを構築する正確な方法に応じて、次のことが可能です。

どちらも、Springを使用してかなり簡単に解決できます。

次のエンティティがあると仮定します。

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

そして、データベースにアクセスするためのSpring Dataリポジトリを定義します:

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

CSVの逆シリアル化には、Jacksonの使用を提案します。 Spring BootはすでにJacksonに付属していますが、pomにCSVのデータ形式拡張機能を追加する必要があります。

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

このようにして、特定のPOJOクラスのCSVを読み取ることを知っている単純なユーティリティメソッドを作成できます。

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

次に、アップロードを処理するための単純なRest Controllerを作成します。

@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());
    }
}

アップロードを行うためにHTMLも必要な場合、次のスニペットは最小限の作業例です。

<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

OpenCSVで簡単に実現できます。既知のPOJOユーザーの場合、CSV列(ケースのヘッダー)をPOJOの対応するフィールドにマップするだけです。

以下を依存関係に追加するだけで、アプリケーションの最新バージョンを確認できます。

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

このリンクは https://www.geeksforgeeks.org/mapping-csv-to-javabeans-using-opencsv/ をガイドします。

0
Integral Master