【问题标题】:csv date to remove slashescsv 日期删除斜线
【发布时间】:2018-03-27 12:52:26
【问题描述】:

这是我关于如何为一个 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();
    }
}
}

【问题讨论】:

  • 跟进什么? This?如果是这样,请将链接放在您的问题中,或者不要说这是后续问题。
  • @AndyTurner 是的,它是我之前提出的那个(--this?--)问题的后续......
  • 幸运,问题出在你的 JDBC 代码上,而不是你在这个问题上面发布的内容。请向我们展示该代码。
  • @TimBiegeleisen 我真的认为问题出在斜杠上,因为 mysql 中的表将 paydate 列设置为 INT,我怀疑它需要除数值之外的任何其他字符集。
  • 为什么要在整数列中插入日期/文本日期?你是不是觉得有点过时了?您应该将这些日期插入日期列;它们采用 MySQL 可以处理的格式。

标签: java csv user-interface bufferedreader


【解决方案1】:

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

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();
}

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

【讨论】:

  • 当我使用上述方法时,在 '(?,?,?,?)' 行中出现语法错误。
  • 这不应该发生。我猜你复制错误,或者你的代码有其他问题。您确定您使用的是prepared语句,而不是常规语句吗?
  • 感谢蒂姆,我设法消除了错误,唯一的问题是现在当我检查 mysql 时,即使它说导入成功,也没有写入表,但再次感谢
  • 这真的很奇怪。一种可能性是您出于某种原因将自动提交设置为 false,并且在您的代码中您从未明确提交事务。这将解释执行所有这些插入但在您的表中没有实际数据。也可能有其他原因。
  • 感谢蒂姆,我检查并自动提交设置为真,再次感谢,如果我失败了,我会尝试检查有什么问题,我会单独询问。
猜你喜欢
  • 2014-07-23
  • 2015-06-06
  • 1970-01-01
  • 2018-09-18
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多