Вставьте анализируемый CSV-файл в SQL Server

Я разбираю файл CSV, используя библиотеку OpenCSV. Мне удалось пропустить первые нужные строки, выбрать только нужные столбцы и вывести их на консоль.
Теперь я пытаюсь вставить это в базу данных MSSQL.
Это мой код для разбора файла:

JFileChooser fileopen = new JFileChooser();
    FileFilter filter = new FileNameExtensionFilter(
            "CSV file", "csv");
    fileopen.setFileFilter(filter);

    int ret = fileopen.showDialog(null, "Choose file");
    if (ret == JFileChooser.APPROVE_OPTION) {
        CsvParserSettings settings = new CsvParserSettings();

        settings.detectFormatAutomatically();
        settings.setHeaderExtractionEnabled(true);
        settings.selectIndexes(7, 8, 13, 14);
        settings.setNumberOfRowsToSkip(9);

        List<String[]> rows = new CsvParser(settings).parseAll((fileopen.getSelectedFile()), "UTF-8");
        rows.forEach(arr -> System.out.println(Arrays.toString(arr)));  

Теперь код

INSERT INTO dbo.Glass(Nr_Temp) values(Arrays.toString(rows.get(1)));

Получает ли я всю строку вместо столбца (что понятно :)), но есть ли другое решение для возврата значений столбцов, чтобы вставить их в базу данных SQL?


person n0rek    schedule 30.03.2018    source источник


Ответы (2)


ОБНОВЛЕНО

Вам нужно перебрать String[], чтобы получить доступ к каждому отдельному значению для столбца.

PreparedStatement ps = connection.prepareStatement("INSERT INTO dbo.Szyby_temp(nr_zlec_klienta, nr_ref_klienta, szerokosc, wysokosc, ilosc, opis_dodatkowy, data_importu) VALUES(?, ?, ?, ?, ?, ?, getdate())");
int maxBatchSize = 100; //Using batching for performance
int currentBatchSize = 0; 
for (String[] row : rows) {
    int i = 1;
    for (String columnValue : row) {           
        ps.setString(i++, columnValue); //Parameter indexes start with 1
    }
    ps.addBatch();
    if (++currentBatchSize % maxbatchSize == 0) {
      ps.executeUpdate();
    }
}
ps.executeUpdate(); //if number of rows in csv file is not divisible by maxbatchSize
person Ivan    schedule 30.03.2018
comment
Да, это работает, но как указать columnValue на конкретное значение при вставке? Когда я пробую этот gist.github.com/n0rek/14fcb90eb20a1b7c771ac9685457ad18, он помещает каждое значение в каждая колонка... - person n0rek; 04.04.2018
comment
спасибо, но я получаю значение не установлено для ошибки параметра номер 2. - person n0rek; 04.04.2018
comment
@n0rek, пожалуйста, проверьте, сколько элементов содержится в переменной row. Вы уверены, что в вашем CSV-файле достаточно значений в каждой строке? - person Ivan; 04.04.2018
comment
Строка переменной Ивана содержит 6 элементов, в моей базе данных есть поле идентификатора, которое является идентификатором, 6 переменных, упомянутых в запросе INSERT, и поле даты, которое заполняется оператором getdate() в INSERT. При отладке пс идет все переменные с первой строки и потом вылетает. Для тестирования я создал файл csv только с одной строкой и все еще с этой ошибкой. Изменить: в моем CSV-файле больше столбцов, но я выбираю только 6 из них, используя настройки из библиотеки opencsv. - person n0rek; 04.04.2018
comment
@ n0rek, извините, в моем ответе была опечатка. int i = 1; следует переместить во внешний цикл. - person Ivan; 04.04.2018

Спасибо Иван, убрал оптимизацию, так как файлы маленькие (менее 100 строк в каждом) и тоже поменял

ps.executeupdate() to `ps.executeBatch()

так как он загружал только последнюю строку, теперь он работает отлично, спасибо за ваше время. Вот мой измененный код

try {

            PreparedStatement ps = conn.prepareStatement("INSERT INTO dbo.Szyby_temp(nr_zlec_klienta, nr_ref_klienta, szerokosc, wysokosc, ilosc, opis_dodatkowy, data_importu) VALUES(?, ?, ?, ?, ?, ?, getdate())");
            for (String[] row : rows) {
                int i = 0;
                for (String columnValue : row) {    
                    ps.setString(++i, columnValue); //Parameter indexes start with 1
                }
                ps.addBatch();
            }
            ps.executeBatch(); //if number of rows in csv file is not divisible by maxbatchSize
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e, "ERROR", JOptionPane.ERROR_MESSAGE);

        }
person n0rek    schedule 04.04.2018