Прочитайте файл CSV и проверьте, существует ли содержимое в БД, а затем вставьте только обновление - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь прочитать содержимое загружаемого файла CSV и хочу проверить, имеют ли данные для загрузки комбинации

«Идентификатор + версия (фактическая, бюджет, прогноз) + год»

затем следует удалить существующую запись в БД с этим комбо и загрузить ее.

Пожалуйста, помогите мне, как проверить это, в настоящее время я прочитал все содержимое в моем загруженном CSV-файле, используя,

  while(fileItemsIterator.hasNext()){

  FileItem fileItem = fileItemsIterator.next();

  String fileValue=fileItem.getString();//This returns all my csv content

    }

DB Call

   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

Пожалуйста, помогите мне, как проверить, существует ли 675 + Actaul + 2018 из файла CSV в моей базе данных изатем выполните все операции CRUD соответственно.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Вы можете использовать apache-commons-csv для получения значений из строк csv

Reader reader = new BufferedReader(new InputStreamReader(csvFileInputStream));      
CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT.withIgnoreEmptyLines().withFirstRecordAsHeader().withIgnoreHeaderCase().withTrim()));

Это заставит библиотеку обрабатывать первую строку как заголовки столбцов, а затем вы можете обрабатывать строки как

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 или более, вы можете быть уверены, что оно существуетв базе данных и при необходимости выполните действия.

Еще одна вещь, которую можно сделать, - это (если уже существующая запись не вносит вклад в данные новых записей), вместо того, чтобы использовать запрос выбора, вы всегда удаляетезапись перед вставкой (если запись не существует, ничего не произойдет) как:

String query = "DELETE FROM UPLOAD WHERE ID='"+ID+"' AND AMOUNT_TYPE='"+costType+"' AND COST_YEAR='"+costYear+"'";

, а затем запустит запрос вставки, это гарантирует, что запись никогда не будет вставлена ​​дважды.

0 голосов
/ 27 декабря 2018

Мое предложение будет чисто (PL /) SQL: используйте внешнюю таблицу функцию базы данных, которая позволяет вам читать файл CSV, как если бы это была обычная таблица Oracle.

Чтобы использовать его, вам необходимо иметь доступ к каталогу (объект Oracle, указывающий на каталог в файловой системе; наиболее распространенным местом является сервер базы данных).

Вы сможете проверить, существуют ли уже данные в целевой таблице (с помощью простого оператора SELECT) и обновить их, или - если они не существуют - вставить новую строку.Попробуйте использовать MERGE (который также называется upsert , поскольку вы можете обновлять данные или вставлять данные с помощью той же команды).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...