Java将多行数据从file.txt插入数据库表

时间:2018-07-26 03:34:21

标签: java postgresql filereader java-io

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

1 个答案:

答案 0 :(得分:0)

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

1)在变量声明中使用List代替LinkedList,并从参考点删除通用String。像

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

Link for more explanation on this

2)类似于对您为PreparedStatement做的资源使用try,我将为BufferedReader做同样的事情。这样就无需最后关闭“ BufferedReader”

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

Link for more explanation on this

3)因为您已经为PreparedStatement使用了try资源,所以没有必要拥有ps.close(),因为preparestatement实现了AutoCloseable。因此,尝试使用resouce会解决它

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

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

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