读取 CSV 文件并检查数据库中是否存在内容,然后仅插入其他更新
Read CSV file and check if contents exists in DB and then only insert else update
我正在尝试读取正在上传的 CSV 文件内容,并想检查上传数据是否包含
的组合
“Id + 版本(实际、预算、预测)+年份”
然后应删除数据库中具有该组合的现有记录并上传它。
请帮助我如何检查,目前我已经阅读了我上传的 csv 文件中的所有内容,
while(fileItemsIterator.hasNext()){
FileItem fileItem = fileItemsIterator.next();
String fileValue=fileItem.getString();//This returns all my csv content
}
数据库调用
String existingUploadData ="SELECT ID,AMOUNT_TYPE,COST_YEAR FROM UPLOAD WHERE ID ='"+id+"'";
log.debug ("====existingUploadData QUERY== "+existingUploadData );
PreparedStatement ps = (OraclePreparedStatement) DBConnect.getConnection().prepareStatement(existingUploadData);
ResultSet rs=ps.executeQuery();
if(rs.next()) {
if(rs.getString("ID").equals(fileValue.contains("675"+""+""))) {
//UPDATE EXISTING TABLE
}
} else {
//INSERT SQL
}
文件内容
CSV FILE CONTENT SAMPLE
----------------------------
ID |Cost Type| Year| Leve1 |Level 2 | I/P | Vendor Type | Vendor Name | App.Ref Remarks Amount Unit
----|---------|-----|----------------|----------------|-----------|-------------|---------------|----------------------------------
675 |Actual |2018 | TCO Cost |Solution Support|initiative| 3rd part | ABC | 123 okk 22 EUR
675 |Actual |2018 | Net Book Value| Software |Project | 3rd part | XYZ | 234 good 11 EUR
675 |Actual |2018 | Number of FTE| BUIT | Project | 3rd part | LMN | 435 fine 50 FTE
请帮助我如何检查 CSV 文件中的 675+Actaul+2018 是否已存在于我的数据库中,然后相应地执行所有 CRUD 操作。
我的建议是纯粹的 (PL/)SQL:使用 外部 table 数据库功能,使您能够像读取 CSV 文件一样是一位普通 Oracle table。
为了使用它,您必须有权访问 目录(一个指向文件系统目录的 Oracle 对象;最常见的位置是数据库服务器).
您可以检查数据是否已存在于目标 table 中(使用简单的 SELECT
语句)并更新它,或者 - 如果它不存在 - 插入一个新行。考虑使用 MERGE(也称为 upsert,因为您可以使用同一命令更新或插入数据)。
您可以使用 apache-commons-csv 从 csv 行中获取值
Reader reader = new BufferedReader(new InputStreamReader(csvFileInputStream));
CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT.withIgnoreEmptyLines().withFirstRecordAsHeader().withIgnoreHeaderCase().withTrim()));
这将使库将第一行视为第 headers 列,然后您可以将这些行处理为
List<CSVRecord> csvRecords = csvParser.getRecords();
for(CSVRecord csvRecord : csvRecords) {
String id= csvRecord.get("ID");
String costType = csvRecord.get("Cost Type");
String costYear = csvRecord.get("Year");
//Construct your query here
}
您始终可以执行计数查询来检查数据库中是否存在该记录:
String query = "SELECT COUNT(*) FROM UPLOAD WHERE ID='"+ID+"' AND AMOUNT_TYPE='"+costType+"' AND COST_YEAR='"+costYear+"'";
如果返回的计数为 1 或更多,您可以确定这存在于数据库中,并采取必要的措施。
可以做的另一件事是(如果已经存在的记录对新记录数据没有贡献),而不是使用 select 查询,您总是在插入之前删除记录(如果记录不存在什么都不会发生)如:
String query = "DELETE FROM UPLOAD WHERE ID='"+ID+"' AND AMOUNT_TYPE='"+costType+"' AND COST_YEAR='"+costYear+"'";
然后触发插入查询,这可以确保记录不会被插入两次。
我正在尝试读取正在上传的 CSV 文件内容,并想检查上传数据是否包含
的组合“Id + 版本(实际、预算、预测)+年份”
然后应删除数据库中具有该组合的现有记录并上传它。
请帮助我如何检查,目前我已经阅读了我上传的 csv 文件中的所有内容,
while(fileItemsIterator.hasNext()){
FileItem fileItem = fileItemsIterator.next();
String fileValue=fileItem.getString();//This returns all my csv content
}
数据库调用
String existingUploadData ="SELECT ID,AMOUNT_TYPE,COST_YEAR FROM UPLOAD WHERE ID ='"+id+"'";
log.debug ("====existingUploadData QUERY== "+existingUploadData );
PreparedStatement ps = (OraclePreparedStatement) DBConnect.getConnection().prepareStatement(existingUploadData);
ResultSet rs=ps.executeQuery();
if(rs.next()) {
if(rs.getString("ID").equals(fileValue.contains("675"+""+""))) {
//UPDATE EXISTING TABLE
}
} else {
//INSERT SQL
}
文件内容
CSV FILE CONTENT SAMPLE
----------------------------
ID |Cost Type| Year| Leve1 |Level 2 | I/P | Vendor Type | Vendor Name | App.Ref Remarks Amount Unit
----|---------|-----|----------------|----------------|-----------|-------------|---------------|----------------------------------
675 |Actual |2018 | TCO Cost |Solution Support|initiative| 3rd part | ABC | 123 okk 22 EUR
675 |Actual |2018 | Net Book Value| Software |Project | 3rd part | XYZ | 234 good 11 EUR
675 |Actual |2018 | Number of FTE| BUIT | Project | 3rd part | LMN | 435 fine 50 FTE
请帮助我如何检查 CSV 文件中的 675+Actaul+2018 是否已存在于我的数据库中,然后相应地执行所有 CRUD 操作。
我的建议是纯粹的 (PL/)SQL:使用 外部 table 数据库功能,使您能够像读取 CSV 文件一样是一位普通 Oracle table。
为了使用它,您必须有权访问 目录(一个指向文件系统目录的 Oracle 对象;最常见的位置是数据库服务器).
您可以检查数据是否已存在于目标 table 中(使用简单的 SELECT
语句)并更新它,或者 - 如果它不存在 - 插入一个新行。考虑使用 MERGE(也称为 upsert,因为您可以使用同一命令更新或插入数据)。
您可以使用 apache-commons-csv 从 csv 行中获取值
Reader reader = new BufferedReader(new InputStreamReader(csvFileInputStream));
CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT.withIgnoreEmptyLines().withFirstRecordAsHeader().withIgnoreHeaderCase().withTrim()));
这将使库将第一行视为第 headers 列,然后您可以将这些行处理为
List<CSVRecord> csvRecords = csvParser.getRecords();
for(CSVRecord csvRecord : csvRecords) {
String id= csvRecord.get("ID");
String costType = csvRecord.get("Cost Type");
String costYear = csvRecord.get("Year");
//Construct your query here
}
您始终可以执行计数查询来检查数据库中是否存在该记录:
String query = "SELECT COUNT(*) FROM UPLOAD WHERE ID='"+ID+"' AND AMOUNT_TYPE='"+costType+"' AND COST_YEAR='"+costYear+"'";
如果返回的计数为 1 或更多,您可以确定这存在于数据库中,并采取必要的措施。
可以做的另一件事是(如果已经存在的记录对新记录数据没有贡献),而不是使用 select 查询,您总是在插入之前删除记录(如果记录不存在什么都不会发生)如:
String query = "DELETE FROM UPLOAD WHERE ID='"+ID+"' AND AMOUNT_TYPE='"+costType+"' AND COST_YEAR='"+costYear+"'";
然后触发插入查询,这可以确保记录不会被插入两次。