【问题标题】:Java Insert multi row data from file.txt to table of database [duplicate]Java将file.txt中的多行数据插入数据库表[重复]
【发布时间】:2019-01-02 23:08:44
【问题描述】:

我有一个包含几行的文本文件。 我想将整行添加到数据库表中。 在插入到表之前,它应该是substring 以获取数据库表的字段值。我认为我的代码(查询)不适合大数据。我知道还有其他方法可以做到这一点。

public class ReaderFilesData {
    LinkedList<String> listFiles = new LinkedList<String>();
    private Path path = Paths.get("src/FilesDownloaded/");
    DataTRX dataTRX = new DataTRX();

    public void readFiles() {
        File[] listFile = new File(path.toString()).listFiles();
        for (File file : listFile) {
            if (file.isFile()) {
                listFiles.add(file.getName());
            }
        }
        System.out.println("Total Files : " +listFiles.size());
    }

    public void readData() {
        Path pathsourceFile;

        String line;
        BufferedReader reader;
        for (int i=0; i<listFiles.size(); i++) {
            try {
                String fileName = listFiles.get(i);
                System.out.println("FileName : " +fileName);
                pathsourceFile = Paths.get("src/FilesDownloaded/"+fileName+"");
                reader = new BufferedReader(new FileReader(pathsourceFile.toString());
                while ((line = reader.readLine())!=null) {
                    int startPoint = line.lastIndexOf(';')+1;
                    String valueLine = new String(line.substring(startPoint));
                    System.out.println("Transaction data : " +valueLine);
                    dataTRX.setId(valueLine.substring(0,2));
                    dataTRX.setAmount(Integer.parseInt(valueLine.substring(2, 10)));
                    dataTRX.setDesc(valueLine.substring(10, 18));

                    System.out.println("getId      : " + dataTRX.getId());
                    System.out.println("getAmount       : " + dataTRX.getAmount());
                    System.out.println("getDesc   : " + dataTRX.getDesc());

                    importData(dataTRX.getId(), 
                                dataTRX.getAmount(),
                                dataTRX.getDesc(),

                }
                reader.close();
            } catch (Exception e) {
                e.getMessage();
            }
        }
    }

    public void importData(String id, int amount, String discount ) {

    String insertData = "INSERT INTO tbl_trx (id, amount, desc) "
        + "VALUES (?,?,?)";

    try {
        try (PreparedStatement ps = GeneralRules.conn.prepareStatement(insertData)) {

            ps.setString(1, id);
            ps.setInt(2, amount);
            ps.setString(4, desc);
            ps.executeUpdate();
            System.out.println("Data successfully update to database!!!\n");
            ps.close();
        }

    } catch (Exception e) {
        e.getMessage();
    }
}

这是file.txt的示例数据

  • 320000000200000001
  • 2G0000000500000002
  • AB0000001500000001

我在上面一行做子字符串数据库:

  • 子字符串 id,amount,discount (32,00000002,00000001)
  • 子字符串 id,amount,discount (2G,00000005,00000002)
  • 子字符串 id,amount,discount (AB,00000015,00000001)

【问题讨论】:

  • 真正的问题是什么?
  • 在尝试提出更多问题之前,请先阅读How do I ask a question that is answerable?,这样您才能更好地准备好并能够提出一个广受欢迎且更重要的是可回答的问题。。跨度>
  • 主要基于意见 - 许多好的问题会根据专家经验产生一定程度的意见,但这个问题的答案往往几乎完全基于意见,而不是事实、参考资料或特定专业知识。请先阅读What types of questions should I avoid asking?,然后再尝试自动提出过于宽泛的更多问题。

标签: java postgresql filereader java-io


【解决方案1】:

您的代码对我来说似乎不错。但如果我会写它,在优化/替换之下,我会做的

1) 在变量声明中使用List 代替LinkedList 并从参考点中删除通用String。类似的东西

List&lt;String&gt; listFiles = new LinkedList&lt;&gt;();

Link for more explanation on this

2) 与对 PreparedStatement 所做的资源尝试类似,我会对 BufferedReader 做同样的事情。这将消除最后关闭“BufferedReader”的需要

try (BufferedReader reader = new BufferedReader(new FileReader(pathsourceFile.toString())))

Link for more explanation on this

3) 因为PreparedStatement 使用了try with resource,所以不需要ps.close(),因为preparedstatement 实现了AutoCloseable。所以尝试使用资源会解决它

4) 我会使用e.printStackTrace() 而不是e.getMessage(),因为它会为我提供有关错误的更多信息

就您对子字符串的使用而言,我会使用它,或者会使用正则表达式来拆分字符串。

如果要插入的行数更多,我认为这是你的情况,而不是每次都调用executeUpdate(),而是使用Batch 模式。即使用addBatch()将语句添加到PreparedStatement批处理并使用executeBatch()一次性执行

【讨论】:

  • 好的,谢谢您的建议,但是如果我使用该插入查询来处理数千个数据,这可能吗?以及 ps.executeBatch(); 怎么样? ?
  • 如果记录数很大,使用PreparedStatement的批处理模式。使用ps.addBatch(); 和prepStmt.executeBatch() 执行更多记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多