首页 > 解决方案 > Java将file.txt中的多行数据插入数据库表

问题描述

我有一个由几行组成的文本文件。我想将整行添加到数据库表中。在插入表之前,应该是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,金额,折扣 (2G,00000005,00000002)
  • 子字符串 id,金额,折扣 (AB,00000015,00000001)

标签: javapostgresqlfilereaderjava-io

解决方案


你的代码对我来说似乎很好。但是如果我在优化/替换下面写它,我会做的

1)在变量声明中使用List而不是从引用点中删除泛型。就像是LinkedListString

List<String> listFiles = new LinkedList<>();

链接以获得更多解释

2) 与使用 try 和你为PreparedStatement做的资源类似,我也会为BufferedReader. 这将消除最后关闭“BufferedReader”的需要

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

链接以获得更多解释

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

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

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

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


推荐阅读