実現したいこと
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
大変申し訳ございません
プログラム初心者の為、無駄なコードなどがあり見辛いと思いますがご了承ください。
回答2件
あなたの回答
tips
プレビュー