csv日期删除斜杠

时间:2018-03-27 12:52:26

标签: java csv user-interface bufferedreader

这是关于如何为一个csv文件使用两个分隔符的后续问题。我有一个具有以下日期格式的csv文件。

2018/01/25
2018/01/27

我需要将csv上传到mySql表中,该表将日期作为INT而不是Date或String格式。

当我尝试上传csv时,我收到一条错误消息,指出日期列已被截断。

我认为这是由于' /'在日期之间。

分隔符由bufferedReader处理。这是我的代码如下。

  while ((br.readLine()) != null) {
            String line = br.readLine();// br string variable
            String[] rawRow = line.split(",");
            String lastEntry = rawRow[rawRow.length - 1];//this contains the LinkId/branchNo
            String[] properLastEntry = lastEntry.split("/");//this contains the LinkId/branchNo split into two columnms
            String[] oneRow = new String[rawRow.length + 1];
            System.arraycopy(rawRow, 0, oneRow, 0, rawRow.length - 1);
            System.arraycopy(properLastEntry, 0, oneRow, oneRow.length - properLastEntry.length, properLastEntry.length);

            model.addRow(new Object[0]);
            model.setValueAt(oneRow[0], row, 0);
            model.setValueAt(oneRow[1], row, 1);
            model.setValueAt(oneRow[2], row, 2);
            model.setValueAt(oneRow[3], row, 3);
            row++;
            }
         br.close();

这是我的jdbc代码。

private void SaveData(){
    Connection connect = null;
    Statement stmt = null;

    try{

        //DriverManager Loader
        Class.forName("com.mysql.jdbc.Driver");

        //connection string url.. the port//schema name//username//password
                                                //this is the test Server ;oginDetails
        connect = DriverManager.getConnection("jdbc:mysql://localhost:3306/riskfin", "root", "riskfin"); //-------------> this is for the localhost server
        stmt = connect.createStatement();

        for(int i = 0;i<table.getRowCount();i++)
        {
            String PayDate = table.getValueAt(i,0).toString();
            String Ammount = table.getValueAt(i,1).toString();
            String LinkID = table.getValueAt(i,2).toString();
            String BranchNo = table.getValueAt(i,3).toString();

            String  sql = "Insert into temp_payment_import "
                    +"VALUES('"+LinkID+"','"
                    +Ammount+"','"
                    +PayDate+"','"
                    +BranchNo+"')";

            stmt.execute(sql);
       }

        JOptionPane.showMessageDialog(null,"Data imported Successfully");

    }catch(Exception ex){
        JOptionPane.showMessageDialog(null,ex.getMessage());
        ex.printStackTrace();
    }
    try{
        if(stmt!= null){
            stmt.close();
            connect.close();
        }
    }catch(SQLException e){
        System.out.println(e.getMessage());
        e.printStackTrace();
    }
}
}

1 个答案:

答案 0 :(得分:0)

我发现您当前的JDBC代码存在两个主要问题。首先,您没有使用预准备语句,从而增加了insert语句出现问题的可能性。其次,您没有明确列出插入的目标列,也会引发问题。请考虑以下修改:

for (int i=0;i < table.getRowCount(); i++) {
    String sql = "INSERT INTO temp_payment_import "
     + "(PayDate, Amount, LinkID, BranchNo) VALUES "
     + "(?, ?, ?, ?)";
    PreparedStatement ps = connect.prepareStatement(sql);
    ps.setString(1, PayDate);
    ps.setDouble(2, Double.parseDouble(Ammount));
    ps.setInt(3, Integer.parseInt(LinkID));
    ps.setInt(4, Integer.parseInt(BranchNo));
    ps.executeUpdate();
}

虽然这可能不会按原样运行,但它是朝着正确方向迈出的一步。现在,insert语句明确列出了列,因此您不可能将错误的值插入某个列。因为您的所有数据似乎都是字符串值,所以您可能需要做一些工作才能获得付款日期的日期/时间戳。我使用上面的setString,如果你的日期是MySQL接受的ISO格式,它应该可以正常工作。但最好使用JDBC为日期识别的格式日期类型。