Прочитать файл на основе позиции с фиксированной длиной и вставить в таблицу оракулов в Java - PullRequest
0 голосов
/ 24 августа 2018

В настоящее время я работаю над решением для чтения огромного файла на основе 454 символов / строки (минимум 50000 строк) через Java. В соответствии с требованием, это файл на основе позиционирования, нам сначала нужно прочитать файл, а затем проанализировать значения на основе позиции и необходимо вставить в таблицу. (минимум 96 позиций будут вставлены в 96 столбцов таблицы).

Я взял эту концепцию после разбора.

[ INSERT ALL INTO<TABLE NAME> [COL1,COL2,COL3] Values [VAL1,VAL2,VAL3]
                INTO<TABLE NAME> [COL1,COL2,COL3] Values [VAL1,VAL2,VAL3]
SELECT * FROM DUAL;]

Вот мой код:

try{
    char[] line = new char[456];
    while(br.read(line) > 0){ 
        StringBuilder input = new StringBuilder(new   String(line));

        if(batchCounter>0){
            int detailFileId = interfaceFileSequence();
            sql.append(initSql+"(" + 
                detailFileId + "," + interfaceHeaderId + ", SYSDATE," +
                interfaceRunId + "," + isSpace(input.substring(0, 2).trim()) + "," + "TO_DATE("+isSpace(input.substring(2, 12).trim())+",'YYYY-MM-DD')" +","+isSpace(input.substring(12, 22).trim()) + "," + 
                Double.parseDouble(input.substring(22, 35)+ "." + input.substring(35, 37)) + ", " + 
                Double.parseDouble(input.substring(22, 35)+ "." + input.substring(35, 37)) + ", " + 
                isSpace(input.substring(38, 44).trim()) + ","+isSpace(input.substring(38, 44).trim())+"," +isSpace(input.substring(38, 44).trim())+"," + isSpace(input.substring(44, 54).trim())+","+

                isSpace(input.substring(54, 60).trim()) + "," + isSpace(input.substring(60, 68).trim()) + "," + isSpace(input.substring(68, 83).trim()) + "," + 
                isSpace(input.substring(83, 89).trim()) + "," + isSpace(input.substring(89, 94).trim()) + "," + 
                isSpace(input.substring(94, 102).trim()) + "," + 
                isSpace(input.substring(102, 103).trim()) + ","+"TO_DATE("+isSpace(input.substring(103,113).trim())+",'YYYY-MM-DD')"+"," +isSpace(input.substring(113, 125).trim()) + "," + isSpace(input.substring(125, 128).trim()) + "," + 
                isSpace(input.substring(131, 133).trim()) + "," + isSpace(input.substring(133, 135).trim()) + "," + isSpace(input.substring(135, 136).trim()) + "," + 
                isSpace(input.substring(136, 137).trim()) + "," + isSpace(input.substring(137, 142).trim()) + "," + isSpace(input.substring(142, 147).trim()) + "," + 
                isSpace(input.substring(147, 148).trim()) + "," + isSpace(input.substring(149, 159).trim()) + "," +  
                isSpace(input.substring(159, 160).trim()) + "," + isSpace(input.substring(160, 175).trim()) + "," + isSpace(input.substring(160, 175).trim()) + "," +

                isSpace(input.substring(190, 220).trim()) +"," +"TO_DATE("+isSpace(input.substring(216, 220)+"-"+input.substring(220, 222)+"-"+input.substring(222, 224))+",'YYYY-MM-DD')"+","+
                "TO_DATE("+isSpace(input.substring(216, 220)+"-"+input.substring(220, 222)+"-"+input.substring(222, 224))+",'YYYY-MM-DD')"+","+ isSpace(input.substring(226,227).trim()) + "," + isSpace(input.substring(231,236).trim()) + "," + 
                isSpace(input.substring(242, 245).trim()) + "," + isSpace(input.substring(245,275).trim()) + "," + isSpace(input.substring(275,280).trim()) + "," + 
                isSpace(input.substring(280, 290).trim()) + "," + isSpace(input.substring(290,293).trim()) + "," + isSpace(input.substring(293,303).trim()) + "," + 
                isSpace(input.substring(303, 314).trim()) + "," + 
                isSpace(input.substring(313,316).trim()) +  //need check
                "," + isSpace(input.substring(317,337).trim()) + "," +

                isSpace(input.substring(337, 422).trim()) + 
                "," + isSpace(input.substring(422,433).trim()) + "," + isSpace(input.substring(433,443).trim())+","+isSpace(input.substring(22, 39).trim())+
                ")");
            sql.append('\n');
        }

        /*if (batchCounter % 500 == 0) {
            System.out.println("sql:::::::::::"+sql);
            int executeUpdate = em.createNativeQuery(sql.toString()).executeUpdate();
            System.out.println("executeUpdateexecu:::"+executeUpdate);
            em.flush();
            insertionCounter += executeUpdate;
            System.out.println("insertionCounter::::"+insertionCounter);
            sql.setLength(0);
            System.out.println("SQL");
            System.out.println("initSql"+initSql);
            sql.append(initSql);
        }*/

        batchCounter++; 
    } 

        sql.append("  SELECT * FROM dual");


    int executeUpdate = em.createNativeQuery(sql.toString()).executeUpdate();
    em.flush();
    insertionCounter += executeUpdate;
    System.out.println("Check Rows in file::"+(batchCounter-1)+"  Insertion counter::"+insertionCounter);
    if((batchCounter-1)==insertionCounter){
        detailFileObj = new DetailFileObject(FileName, "DETAIL", (batchCounter-1), "SUCCESS");
    }
    else {
        detailFileObj = new DetailFileObject(FileName, "DETAIL", (batchCounter-1), "FAILED");
    }
} catch (IOException e) {
    e.printStackTrace();
} 

Но как только я запускаю код, если есть 40-50 строк, он работает нормально. Но я получаю исключение. Может ли кто-нибудь поделиться со мной правильным подходом наряду с выполнением кода, чтобы я мог его использовать. Спасибо

1 Ответ

0 голосов
/ 24 августа 2018

Во-первых, НЕ используйте конкатенацию строк для построения оператора SQL с текстовыми значениями извне.Это делает вас уязвимыми для SQL-инъекций атак и может вызвать синтаксические ошибки SQL.Вместо этого используйте PreparedStatement с маркерами параметров ?.

Во-вторых, если вы вставляете много записей, используйте пакетную обработку JDBC.

Вотпример того, как вы будете его использовать:

String sql = "INSERT INTO MyTable" +
            " ( Col1, Col2, Col3, Col4, Col5, Col6, Col7 )" +
            " VALUES (?,?,SYSDATE,?,?,?,?)";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
    char[] line = new char[456];
    int batchSize = 0;
    while (br.read(line) > 0) {
        String input = new String(line);
        int detailFileId = interfaceFileSequence();
        stmt.setInt   (1, detailFileId);
        stmt.setInt   (2, interfaceHeaderId);
        stmt.setInt   (3, interfaceRunId);
        stmt.setString(4, toString(input.substring(0, 2)));
        stmt.setDate  (5, toDate(input.substring(2, 12)));
        stmt.setString(6, toString(input.substring(12, 22)));
        // ...
        stmt.addBatch();
        if (++batchSize == 1000) {
            stmt.executeBatch();
            batchSize = 0;
        }
    }
    if (batchSize != 0) {
        stmt.executeBatch();
    }
} catch (IOException e) {
    e.printStackTrace();
}

Приведенный выше код использует следующие вспомогательные методы для хранения кода DRY :

private static String toString(String text) {
    String trimmed = text.trim();
    return (trimmed.isEmpty() ? null : trimmed);
}
private static java.sql.Date toDate(String text) {
    String trimmed = text.trim();
    return (trimmed.isEmpty() ? null : java.sql.Date.valueOf(LocalDate.parse(trimmed)));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...