¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.se.simu.utils; |
| | | |
| | | import org.apache.commons.csv.CSVFormat; |
| | | import org.apache.commons.csv.CSVRecord; |
| | | |
| | | import java.io.IOException; |
| | | import java.io.InputStreamReader; |
| | | import java.io.Reader; |
| | | import java.nio.file.Files; |
| | | import java.nio.file.Paths; |
| | | import java.sql.*; |
| | | |
| | | public class CsvToSQLiteUtils { |
| | | |
| | | private static final String DATABASE_URL = "jdbc:sqlite:D:\\0a_project\\simulation\\simuserver\\rainfall.db"; // SQLiteæ°æ®åºè·¯å¾ |
| | | private static final String CREATE_TABLE_SQL = |
| | | "CREATE TABLE IF NOT EXISTS rainfall (" + |
| | | " id INTEGER PRIMARY KEY AUTOINCREMENT," + |
| | | " station_name TEXT NOT NULL," + |
| | | " rainfall REAL NOT NULL," + |
| | | " longitude REAL NOT NULL," + |
| | | " latitude REAL NOT NULL," + |
| | | " datetime TEXT NOT NULL" + |
| | | ");"; |
| | | |
| | | private static final String INSERT_DATA_SQL = |
| | | "INSERT INTO rainfall (station_name, rainfall, longitude, latitude, datetime) " + |
| | | "VALUES (?, ?, ?, ?, ?);"; |
| | | |
| | | public static void main(String[] args) { |
| | | // CSVæä»¶è·¯å¾ |
| | | String csvFilePath = "D:\\0a_project\\model\\shp\\é¨éç«ç¹æ°æ®\\é¨éç«å
å«åæ .csv"; |
| | | |
| | | // 1. å建SQLiteæ°æ®åºè¿æ¥ |
| | | try (Connection conn = DriverManager.getConnection(DATABASE_URL)) { |
| | | if (conn != null) { |
| | | // è·åå½åæ¶é´æ³ |
| | | Timestamp timestamp = new Timestamp(System.currentTimeMillis()); |
| | | String tableName = "rainfall_" + timestamp.getTime(); |
| | | System.out.println("tableName = " + tableName); |
| | | // 2. å建表 |
| | | createTableIfNotExists(conn, tableName); |
| | | |
| | | // 3. 设置 SQLite è¿æ¥çå符ç¼ç 为 UTF-8 |
| | | try (Statement stmt = conn.createStatement()) { |
| | | stmt.execute("PRAGMA encoding = 'UTF-8';"); // 设置SQLiteç¼ç 为UTF-8 |
| | | } |
| | | |
| | | // 4. å¼å§äºå¡ |
| | | conn.setAutoCommit(false); |
| | | |
| | | // 5. 读åCSVæä»¶å¹¶æå
¥æ°æ® |
| | | readCsvAndInsertData(csvFilePath, conn, tableName); |
| | | |
| | | // 6. æäº¤äºå¡ |
| | | conn.commit(); |
| | | |
| | | System.out.println("æ°æ®æåæå
¥å°SQLiteæ°æ®åºï¼"); |
| | | } |
| | | } catch (SQLException e) { |
| | | System.err.println("SQLiteè¿æ¥å¤±è´¥: " + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å建表ï¼å¦æä¸åå¨çè¯ |
| | | */ |
| | | private static void createTableIfNotExists(Connection conn) throws SQLException { |
| | | try (Statement stmt = conn.createStatement()) { |
| | | stmt.execute(CREATE_TABLE_SQL); |
| | | } |
| | | } |
| | | |
| | | private static void createTableIfNotExists(Connection conn, String tableName) throws SQLException { |
| | | |
| | | try (Statement stmt = conn.createStatement()) { |
| | | String CREATE_TABLE_SQL = |
| | | "CREATE TABLE IF NOT EXISTS " + tableName + " (" + |
| | | " id INTEGER PRIMARY KEY AUTOINCREMENT," + |
| | | " station_name TEXT NOT NULL," + |
| | | " rainfall REAL NOT NULL," + |
| | | " longitude REAL NOT NULL," + |
| | | " latitude REAL NOT NULL," + |
| | | " datetime TEXT NOT NULL" + |
| | | ");"; |
| | | stmt.execute(CREATE_TABLE_SQL); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 读åCSVæä»¶å¹¶å°æ°æ®æå
¥å°SQLiteæ°æ®åº |
| | | * |
| | | * @param csvFilePath CSVæä»¶è·¯å¾ |
| | | * @param conn SQLiteæ°æ®åºè¿æ¥ |
| | | */ |
| | | private static void readCsvAndInsertData(String csvFilePath, Connection conn, String tableName) { |
| | | // ä½¿ç¨ Apache Commons CSV 读åCSVæä»¶ |
| | | try (Reader reader = new InputStreamReader(Files.newInputStream(Paths.get(csvFilePath)), "GBK")) { |
| | | // try (Reader reader = new InputStreamReader(Files.newInputStream(Paths.get(csvFilePath)), StandardCharsets.UTF_8)) { |
| | | Iterable<CSVRecord> records = CSVFormat.DEFAULT |
| | | .withHeader("é¨éç«", "éé¨é", "ç»åº¦", "纬度", "datatime") |
| | | .withSkipHeaderRecord() // è·³è¿è¡¨å¤´ |
| | | .parse(reader); |
| | | |
| | | String INSERT_DATA_SQL = |
| | | "INSERT INTO " + tableName + " (station_name, rainfall, longitude, latitude, datetime) " + |
| | | "VALUES (?, ?, ?, ?, ?);"; |
| | | |
| | | // åå¤SQLæå
¥è¯å¥ |
| | | try (PreparedStatement pstmt = conn.prepareStatement(INSERT_DATA_SQL)) { |
| | | int batchSize = 1000; // æ¯æ¹æå
¥çæ°é |
| | | int count = 0; |
| | | |
| | | for (CSVRecord record : records) { |
| | | // è·åæ¯ä¸åçæ°æ® |
| | | String stationName = record.get("é¨éç«"); |
| | | double rainfall = Double.parseDouble(record.get("éé¨é")); |
| | | double longitude = Double.parseDouble(record.get("ç»åº¦")); |
| | | double latitude = Double.parseDouble(record.get("纬度")); |
| | | String datetime = record.get("datatime"); |
| | | |
| | | // 设置æå
¥æ°æ®çåæ° |
| | | pstmt.setString(1, stationName); |
| | | pstmt.setDouble(2, rainfall); |
| | | pstmt.setDouble(3, longitude); |
| | | pstmt.setDouble(4, latitude); |
| | | pstmt.setString(5, datetime); |
| | | |
| | | // æ¹éæ·»å å°æ¹å¤çä¸ |
| | | pstmt.addBatch(); |
| | | count++; |
| | | |
| | | // æ¯1000æ¡æ°æ®æ§è¡ä¸æ¬¡æ¹å¤ç |
| | | if (count % batchSize == 0) { |
| | | pstmt.executeBatch(); // æ§è¡æ¹éæå
¥ |
| | | } |
| | | } |
| | | // æ§è¡å©ä½çæ¹éæå
¥ |
| | | pstmt.executeBatch(); |
| | | } |
| | | } catch (IOException | SQLException e) { |
| | | System.err.println("读åCSVææå
¥æ°æ®æ¶åºé: " + e.getMessage()); |
| | | } |
| | | } |
| | | } |