读取 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+"'";

然后触发插入查询,这可以确保记录不会被插入两次。