java - 从 .csv 列字段中删除逗号并导入到数据库

标签 java sql jdbc db2

下面的类会将 .csv 导入数据库表。它工作正常。 但是当它遇到像2,345这样的数值时。这会导致错误。

在我的 .csv 文件中,有 3 列,如下所示:

db2 表“COMPUTER”中这些列的数据类型为 COL_A(VArchar 50)、COL_B(Double)、COL_C(Varchar 50)

COL_A | COL_B | COL_C

<小时/>

KKGG56 | 7,567 | 7,567 2013年6月

GGHHK2 | 259,024 | 259,024 2012 年 5 月

那么,如何在导入数据库表时从特定列中删除这些逗号以及将代码放置在程序中的何处?请帮忙。

public class CSVLoader {

private static final 
    String SQL_INSERT = "INSERT INTO OPM.${table}
         (${keys})      VALUES(${values})";

private static final String TABLE_REGEX = "\\$\\{table\\}";

private static final String KEYS_REGEX = "\\$\\{keys\\}";

private static final String VALUES_REGEX = "\\$\\{values\\}";

private Connection connection;

private char seprator;

public CSVLoader(Connection connection) {

    this.connection = connection;

    //Set default separator

    this.seprator = ',';
}

      public void loadCSV(String csvFile, String tableName) throws Exception {

    CSVReader csvReader = null;

    if(null == this.connection) {

        throw new Exception("Not a valid connection.");
    }

    try {

        csvReader = new CSVReader(new FileReader(csvFile), this.seprator);

    } catch (Exception e) {

        e.printStackTrace();

        throw new Exception("Error occured while executing file. "

                   + e.getMessage());

              }

        String[] headerRow = csvReader.readNext();

    if (null == headerRow) {

        throw new FileNotFoundException(


                        "No columns defined in given CSV file." +

                         "Please check the CSV file format.");
    }

    String questionmarks = StringUtils.repeat("?,", headerRow.length);

    questionmarks = (String) questionmarks.subSequence(0, questionmarks

            .length() - 1);


    String query = SQL_INSERT.replaceFirst(TABLE_REGEX, tableName);

    query = query
            .replaceFirst(KEYS_REGEX, StringUtils.join

             (headerRow,   ","));

    query = query.replaceFirst(VALUES_REGEX, questionmarks);

            System.out.println("Query: " + query);

    String[] nextLine;

    Connection con = null;

    PreparedStatement ps = null;

    try {
        con = this.connection;

        con.setAutoCommit(false);

        ps = con.prepareStatement(query);

                       final int batchSize = 1000;

                     int count = 0;

        Date date = null;

        while ((nextLine = csvReader.readNext()) != null) {

            System.out.println( "inside while" );

            if (null != nextLine) {

                int index = 1;

                for (String string : nextLine) {

                    date = DateUtil.convertToDate(string);

        if (null != date) {

                    ps.setDate(index++, new java.sql.Date(date

                    .getTime()));

                     } else {

                  ps.setString(index++, string);

    System.out.println( "string" +string);

                    }

                }

                ps.addBatch();

            }

            if (++count % batchSize == 0) {

                ps.executeBatch();

            }

                     }


        ps.executeBatch(); // insert remaining records

        con.commit();

    } catch (Exception e) {

        con.rollback();

        e.printStackTrace();

        throw new Exception(

        "Error occured while loading data 

                from file                to                      database."

               + e.getMessage());

    } finally {

             if (null != ps)


            ps.close();

        if (null != con)

            con.close();

            System.out.println("csvReader will be closed");

        csvReader.close();

    }

}

public char getSeprator() {

    return seprator;

}

public void setSeprator(char seprator) {

    this.seprator = seprator;

}


         }

最佳答案

回答您的问题:
您必须使用 Double.parseDouble("2,345".replaceAll(",","")) 解析 CSV 文本,但必须调用 ps.setDouble()在数据库中存储 double 值,而不是 ps.setString()!

for (String string : nextLine) {
  date = DateUtil.convertToDate(string);

  if (null != date) {
    ps.setDate(index++, new java.sql.Date(date.getTime()));
  } 
  else {
     try {
       final double doubleValue = Double.parseDouble(string.replaceAll(",",""));

       ps.setDouble(index++, doubleValue);
     }
     catch(NumberFormatException e) {
       // For invalid double
       ps.setString(index++, string);
     }
  }

这段代码不太健壮,如果你在第三列中有日期或数字,你就会遇到麻烦!看着 https://stackoverflow.com/questions/18067934/parsing-csv-file-with-java/18068238#18068238要使用高级映射解决方案,您需要提前了解数据结构。

关于java - 从 .csv 列字段中删除逗号并导入到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18400753/

相关文章:

java - 将 weld-se 与 Gradle 应用程序插件一起使用时的 Bean 发现问题

java - 使用 Hibernate 映射作为 native 查询获取不完整的对象

php - WordPress WP_Query 'orderby' 不工作

php - 错误 : Table 'days.days' doesn't exist

Java JDBC 连接状态

java - 在正则表达式中设置最小和最大字符

java - 在 JCheckBoxMenuItem 中,如何仅使复选框刻度线可见

mysql - 获取数据子集到 qplot

tomcat - 在servlet中定义Connection,Statement,ResultSet的位置

mysql - JDBC 连接失败,当第一次尝试登录时,过了一会儿