質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

3回答

6114閲覧

SpringBootを使って、Web上にアップロードされたcsvファイルからデータベース(PostgreSQL)のテーブルにレコードを一括追加したい

.ke

総合スコア1

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

1クリップ

投稿2020/08/17 05:15

編集2020/08/18 00:12

SpringBootを使って、Web上にアップロードされたcsvファイルからデータベース(PostgreSQL)のテーブルにレコードを一括追加したいです。
インターネットで調べて、何とか、以下の様にHTMLと、controller.javaを作成したのですが、SQL文でfileをどう扱えばいいのか分かりません。
何か良い方法はありませんか?
(エラー等はまだ全く考慮していません。正しいファイルがアップされた前提で動くものが出来れば良いです。)

html

1<form method="post" enctype="multipart/form-data" action="/hogehoge"> 2 <input type="file" name="file" id="file" required/> 3 <br> 4 <input type="submit" value="追加"/> 5</form>

controller

1@RequestMapping(value="/hogehoge", method=RequestMethod.POST) 2public ModelAndView Add(@RequestParam("file")MultipartFile file, ModelAndView mv) { 3 mv.setViewName("hogehogehoge"); 4 jdbcTemplate.update("\copy member_table from ? with csv header",file); //←ココのfileをどうすればいい? 5 return mv; 6}

補足(やりたいこと)

Webサイトでcsvファイルをアップロードし、その内容をDBに挿入したい。
例えば、カラムが名前・年齢・性別のテーブルに以下のようなcsvファイルを入れると

csv

1名前,年齢,性別 2山田花子,20,女 3山田太郎,30,男

以下の様にテーブルに挿入したい。

名前年齢性別
↑(挿入前にあった)名前年齢性別
山田花子20
山田太郎30

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

csvファイルの中身を取り出し、Listに格納(以下参考)後、1行ずつinsert文で挿入できました。

List<String> lines = new ArrayList<String>(); String line = null; try { InputStream stream = file.getInputStream(); Reader reader = new InputStreamReader(stream); BufferedReader buf= new BufferedReader(reader); while((line = buf.readLine()) != null) { StringTokenizer st = new StringTokenizer(line, ","); while (st.hasMoreTokens()) { lines.add(st.nextToken()); } } } catch (IOException e) { line = "Can't read contents."; lines.add(line); e.printStackTrace(); }

参考にしたサイト
https://qiita.com/misskabu/items/81fa2c774f92c63125b5
https://www.atmarkit.co.jp/ait/articles/0407/06/news078.html

投稿2020/08/18 06:02

.ke

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

一番楽なのはファイルデータをバイナリーで取得してblob型として突っ込むのが一番簡単かと思われます

投稿2020/08/17 07:44

ransuS_T

総合スコア106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/08/17 07:50

CSVをそのまま投入したいのではなくCSVに書き込まれたデータをINSERTしたいということでは?COPYコマンド実行しようとされていますし。
.ke

2020/08/18 00:16 編集

ransuS_Tさん、ご回答ありがとうございます。 「ファイルデータをバイナリーで取得してblob型として突っ込む」と、どうなるのか理解できていないので何とも言えませんが、やりたいことはm.ts10806さんのおっしゃっている通り、「CSVをそのまま投入したいのではなくCSVに書き込まれたデータをINSERTしたい」です。 説明が分かりにくく、すみません。。。 補足(やりたいこと)を追加しました。
guest

0

中身を取り出さないのであれば、ひとまずnew File()にてサーバー上の任意のディレクトリに配置するところからでしょうか。

投稿2020/08/17 05:36

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

.ke

2020/08/17 07:27 編集

ご回答ありがとうございます。 (中身を取り出さないのであれば)一度、任意のディレクトリに配置しないとダメなのですね… 分からないなりに色々と試してみたのですが、(今ローカルで作成しているからか)サーバ上に配置するというのが、うまく行かないみたい?です。(ちゃんと理解できてないので、突拍子もないこと言っていたらすみません) 中身を取り出さない方法は一度諦めて、今から中身を取り出す方法を調べて試してみようかと思います。
m.ts10806

2020/08/17 07:49

「spring ファイルアップロード」で出てきた方法で私は実現できてるので、 できないことはないのではと(どういうコード書いたのか提示されないと何とも言えないですけど)
.ke

2020/08/18 06:06

中身を取り出す方法で、何とか動いたので、これで良しとしようと思います。。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問