Как импортировать большой CSV-файл в MySQL с Java, используя подготовленные операторы и пакет - PullRequest
0 голосов
/ 19 марта 2019

здесь у меня есть блок кода, который будет вставлен в таблицу с именем Earnings и будет использовать подготовленные операторы для 4 целых чисел для каждой строки csv, добавлять их в пакет и выполнять пакет, когда все строки будут прочитаны. Почему это начинает вставлять в строке 2009 файла CSV, другими словами, он кажется нестабильным и будет импортировать только часть CSV в таблицу MySQL и как я мог бы сделать пакетное выполнение более эффективным с 6530 строк CSV? Также, как мне обработать подготовленный оператор, который не существует, скажем, что существует возможность наличия int в индексе параметра 4 подготовленного заявления или может быть пустым.

statement.executeUpdate("CREATE TABLE Earnings("
                    + "tournament INT references Tournaments( tournament_id ), "
                    + "player INT references Players( player_id ), "
                    + "prize_money INT, "
                    + "position INT, "
                    + "PRIMARY KEY(tournament, player))");
Statement statement = conn.createStatement();
try{
                String insertTableSQL2 = "INSERT INTO Earnings"
                        + "(tournament, player, prize_money, position) VALUES"
                        + "(?,?,?,?)";
                PreparedStatement preparedStatement2 = conn.prepareStatement(insertTableSQL2);
                BufferedReader reader2 = new BufferedReader(new FileReader("earnings.csv"));
                String line = null; //line read from csv
                Scanner scanner = null; //scanned line
                while ((line = reader2.readLine()) != null) {

                    scanner = new Scanner(line);
                    scanner.useDelimiter(",");

                        while (scanner.hasNext()) {
                            String str = scanner.next();
                            preparedStatement2.setInt(1, Integer.parseInt(str));
                            String str2 = scanner.next();
                            preparedStatement2.setInt(2, Integer.parseInt(str2));
                            String str3 = scanner.next();
                            preparedStatement2.setInt(3, Integer.parseInt(str3));
                            String str4 = scanner.next();
                            preparedStatement2.setInt(4, Integer.parseInt(str4));
                            preparedStatement2.addBatch();
                        }


                }
                preparedStatement2.executeBatch();
                preparedStatement2.close();
                scanner.close();
                reader2.close(); //closing CSV reader
            }
            catch(Exception e){
                e.printStackTrace();
            }
            System.out.println("earnings.csv imported");

CSV форматируется как:

19367,26,677,1
19367,112,271,2
19372,51,134,1
19382,213,150,1
19382,243,50,2
18446,34,2976,1
18446,111,1082,2
19452,28,135,1

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Использовать синтаксис LOAD DATA INFILE. Это будет быстрее, и вам не нужно писать все эти строки кода, если вы используете это.

Проверьте здесь

0 голосов
/ 19 марта 2019

Вы можете использовать библиотеку com.opencsv.CSVReader в качестве программы чтения / записи CSV.И напишите простой код, который построчно читает файл CSV и создает запрос SQL, а затем просто выполняет запрос.

public void loadCSVfile() {
        try (CSVReader reader = new CSVReader(new FileReader("earnings.csv"), ',');
             Connection connection = DBConnection.getConnection();) {
            String insertQuery = "Insert into Earnings (tournament, player, prize_money, position) values (null,?,?,?)";
            PreparedStatement pstmt = connection.prepareStatement(insertQuery);
            String[] rowData = null;
            int i = 0;
            while ((rowData = reader.readNext()) != null) {
                for (String data : rowData) {
                    pstmt.setString(i++, data);
                    pstmt.addBatch();
                    pstmt.executeBatch();
                }
                i = 0;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

Или загрузите его командой MySQL, если это возможно:

public void loadCSV()
    {
        try (Connection connection = DBConnection.getConnection()) {
            String sqlQuery = "LOAD DATA LOCAL INFILE '" + "earnings.csv" + "' INTO TABLE Earnings FIELDS TERMINATED BY ','" + " LINES TERMINATED BY '\n' (tournament, player, prize_money, position) ";
            Statement stmt = connection.createStatement();
            stmt.execute(sqlQuery);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
...