这是关于如何为一个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();
}
}
}
答案 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为日期识别的格式日期类型。