我有一个由几行组成的文本文件。
我想将整行添加到数据库表中。
在将其插入表之前,应为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)
答案 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()
一起执行