teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PostgreSQL

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1130閲覧

JavaからDBに接続してCSVファイルを読み込む

magmag123

総合スコア15

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PostgreSQL

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

0クリップ

投稿2023/06/15 09:26

1

0

実現したいこと

JavaからPostgreSQLに接続して、CSVファイルに記載されているデータをINSERTする。

前提

JavaからPostgreSQLに接続して、CSVファイルを読み込み指定のテーブルにデータをINSERT
させる機能を作成しています。

INSERT文の一番最後のVALUE値に「'(シングルクォーテーション)」が記載できずエラーが
発生してしまいます。

csvファイルをINSERTさせる時、VALUE値の一番最後にシングルクォーテーションを記載するには
どのようなコードを書けばいいのでしょうか?

発生している問題・エラーメッセージ

exception :Unterminated string literal started at position 57 in SQL INSERT INTO Shohin VALUES (11,'シャーペン','事務用品','150','100','2010/11/12). Expected char

該当のソースコード

try { // 読み込む対象のデータ String csv = args.length > 0 ? args[0] : "C:\\csvtest.csv"; // テーブル名の指定 String table = args.length > 0 ? args[1] : "Shohin"; // create a database connection // DBに書き込む // PostgreSQLへ接続 conn = DriverManager.getConnection(url, user, password); // 自動コミットOFF conn.setAutoCommit(false); stmt = conn.createStatement(); stmt.setQueryTimeout(30); try { // データベースに格納予定のデータセット // バイナリファイルを読み込む FileInputStream fis1 = new FileInputStream(new File(csv)); // テキストファイルを読み込む InputStreamReader isr1 = new InputStreamReader(fis1, "UTF-8"); // テキストファイルを読み込むためのクラス BufferedReader br1 = new BufferedReader(isr1); while ((line = br1.readLine()) != null) { StringTokenizer token = new StringTokenizer(line, ","); int column_queue = 0; // 何カラム存在するか while(token.hasMoreTokens()) { String tmpString = token.nextToken(); System.out.println("tmpString:" + tmpString); // 1列目のuidは整数なのでクォーテーションは使わない ** if (column_queue == 0) { insert += tmpString + ","; } else if (column_queue <= 5) { insert += "\'" + tmpString + "\',"; }**### ヘディングのテキスト column_queue++; } // 4カラム存在しない場合は'null'で埋める if (column_queue < 5) { while (column_queue < 5) { insert += "\'null\', "; column_queue++; } } // ヘッダーはinsertしない if (header) { header = false; } else { // System.out.println("insert.length():" + insert.length()); insert = insert.substring(0, insert.length() -2); insert = "INSERT INTO " + table + " VALUES (" + insert + ")"; System.out.println("insert:" + insert); stmt.executeUpdate(insert); } insert = "";//中身をカラにする System.out.println("------------------------------"); //区切り } } catch (FileNotFoundException e) { // TODO: handle exception e.printStackTrace(); } catch (IOException e) { // TODO: handle exception e.printStackTrace(); } // 結果の確認 ResultSet rs = stmt.executeQuery("select * from" + table); while (rs.next()) { System.out.println("\t"+rs.getString("uid")+"\t"+rs.getString("url")+"\t"+rs.getString("contents")+"\t"+rs.getString("value")); } } catch (SQLException e) { // TODO: handle exception // if the error message is "out of memory", // it probably means no database file is found System.err.println("exception :"+e.getMessage()); } finally { try { if(conn != null) conn.close(); } catch (SQLException e) { // TODO: handle exception // connection close failed. System.err.println(e); } }

CSV

10,ボールペン,事務用品,100,NULL,2010/11/11
11,シャーペン,事務用品,150,100,2010/11/12
12,ワイシャツ,衣服,2000,500,2010/11/13
13,フライパン,キッチン用品,1500,500,2010/11/14

補足情報(FW/ツールのバージョンなど)

下記のサイトを参考にしました。
https://tseiya.hatenablog.com/entry/2012/07/11/204453

大変申し訳ございません
プログラム初心者の為、無駄なコードなどがあり見辛いと思いますがご了承ください。

neko_the_shadow👍を押しています

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

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

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

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

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

jimbe

2023/06/15 18:18 編集

SQL を文字列として編集するのではなく、 PreparedStatement を用いてクオーティング等はドライバに任せるようにしてください。 JavaでPreparedStatementを使用する https://qiita.com/ika_katsuo/items/dfbf9ed227ca08256760 なお、列の値が無いことを示す null と文字列の 'null' は全く異なりますが、大丈夫でしょうか。
magmag123

2023/06/16 06:00

ご指摘いただきありがとうございます。 こういった便利なクラスもあるんですね。 参考にさせていただきます。
guest

回答2

0

参考にされたサイトのコードを間違って写されています。

java

1 if (column_queue == 0) { 2 insert += tmpString + ","; 3 } else if (column_queue <= 5) { 4 insert += "\'" + tmpString + "\',"; 5 }

java

1 if (column_queue == 0) { 2 insert += tmpString + ", "; 3 } else if (column_queue <= 5) { 4 insert += "\'" + tmpString + "\', "; 5 }

です。

投稿2023/06/16 10:30

jimbe

総合スコア13352

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

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

0

ベストアンサー

insert = insert.substring(0, insert.length() -2);

この部分を以下のように修正すればよいかと思います。

insert = insert.substring(0, insert.length() -1);

投稿2023/06/15 10:07

neko_the_shadow

総合スコア2395

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

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

jimbe

2023/06/15 18:00

恐らく -2 を -1 にするだけでは全体としてまだ問題が残ると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問