2011-03-01 35 views
8

我想从CSV文件创建一个新的嵌入式h2数据库。 下面是CSV文件的片段如何从CSV文件的某些字段创建h2数据库

国家,城市,AccentCity,地区,人口,经纬度

广告,aixovall,Aixovall,06,42.4666667,1.4833333

广告,安道尔,安道尔,07,42.5,1.5166667

广告,安道尔城,安道尔,07,20430,42.5,1.5166667

广告,安道尔 - VIEILLE,安道尔 - 维埃耶,07,42.5, 1.5166667

广告,安道尔,安道尔,07,42.5,1.5166667

我不想检索csv文件的各个领域。其实,我希望他们除了城市地区字段。

而且,如果人口的内容不是空的,我只想将csv文件的内容插入到数据库中。

因此,在上面的csv示例中,我们必须只将第三行插入到h2表WORLDCITIES中,因为它的“人口”字段被指示。

这是我写的一段代码。但是,正如你所看到的,这还不够:

conn = DriverManager.getConnection(connectionURL, connectionProps); 
Statement stmt = conn.createStatement(); 
stmt.execute("CREATE TABLE WORLDCITIES" 
     + " AS SELECT COUNTRY, ACCENTCITY, POPULATION, LATITUDE, LONGITUDE" 
     + " FROM CSVREAD('snippet.csv')); 

如果我理解正确,CSVREAD创建使用VARCHAR类型的字段,但我想这样的事情:

COUNTRY VARCHAR( 3),ACCENTCITY VARCHAR(40),人口漂浮,纬度漂浮,长度漂浮

预先感谢您的帮助。

回答

9

您可以在CREATE TABLE asdocumented中添加列定义,并将其与WHERE子句结合使用。请注意,使用CREATE TABLE AS SELECT比单独的CREATE TABLE和INSERT INTO语句(不知道速度对你来说很重要)更快一点:

CREATE TABLE WORLDCITIES(
    COUNTRY VARCHAR(3), 
    ACCENTCITY VARCHAR(40), 
    POPULATION FLOAT, 
    LATITUDE FLOAT, 
    LONGITUDE FLOAT) 
AS SELECT 
    COUNTRY, 
    ACCENTCITY, 
    POPULATION, 
    LATITUDE, 
    LONGITUDE 
FROM CSVREAD('snippet.csv') 
WHERE POPULATION IS NOT NULL; 
+1

非常感谢,最后我确实使用过你的解决方案! – paissad 2011-03-03 04:49:21

2

使用H2类Csvread()方法,并遍历ResultSet,插入所需的行,如同找到它们。

+0

这是可能的,但它是一个大量的代码编写。 – 2011-03-02 07:17:04

+0

@Thomas Mueller:谢谢你的评论。你的方法更好。 – trashgod 2011-03-02 15:09:19

3

最后,我继续像你这样建议。 我只是把代码的,我认为是更相关的问题:)

`

private final String createTableString = "" 
    + "CREATE TABLE IF NOT EXISTS " + _tableName 
    + " (" 
    + "id INT UNSIGNED NOT NULL AUTO_INCREMENT, " 
    + "country VARCHAR(3) NOT NULL, " 
    + "city VARCHAR(40) NOT NULL, " 
    + "region VARCHAR (5) NOT NULL, " 
    + "population FLOAT NOT NULL, " 
    + "latitude FLOAT NOT NULL, " 
    + "longitude FLOAT NOT NULL, " 
    + "PRIMARY KEY(id)" 
    + ");"; 

private final String insertString = "" 
    + "INSERT INTO " + _tableName 
    + " (country, city, region, population, latitude, longitude) " 
    + "VALUES (?,?,?,?,?,?)" 
    + ";"; 

public void go() throws IOException, SQLException { 

    loadDriver(); 
    Connection conn = null; 
    Properties connectionProps = new Properties(); 
    connectionProps.put("user", ""); 
    connectionProps.put("password", ""); 
    String connectionURL = _protocol + _subprotocol + _dbName + _dbSettings; 
    ResultSet rs = null; 

    try { 
     conn = DriverManager.getConnection(connectionURL, connectionProps); 
     logger.info("Connected to {} database.", _dbName); 

     conn.setAutoCommit(false); 
     Savepoint savept1 = conn.setSavepoint(); 

     Statement stmt = conn.createStatement(); 
     try { 
      stmt.execute(createTableString); 
      logger.info("The table '{}' created successfully", _tableName); 
     } catch (SQLException sqle) { 
      logger.error("Error while creating the table '{}'", _tableName); 
      printSQLException(sqle); 
     } 

     PreparedStatement pstmt = conn.prepareStatement(insertString); 
     _allStatements.add(pstmt); 
     /* rs:       pstmt: 
     * 1 -> COUNTRY     
     * 2 -> CITY      1 -> COUNTRY 
     * 3 -> ACCENTCITY    2 -> CITY 
     * 4 -> REGION     3 -> REGION 
     * 5 -> POPULATION    4 -> POPULATION 
     * 6 -> LATITUDE     5 -> LATITUDE 
     * 7 -> LONGITUDE    6 -> LONGITUDE 
     */ 
     rs = Csv.getInstance().read(_csvFileName, null, _csvCharset); 
     int rowCount = 0; 
     while (rs.next()) { 
      if (rs.getFloat(5) != 0) { // If population is not null. 
       pstmt.setString(1, rs.getString(1)); // country 
       pstmt.setString(2, rs.getString(3)); // city (accentcity in reality) 
       pstmt.setString(3, rs.getString(4)); // region 
       pstmt.setFloat(4, rs.getFloat(5)); // population 
       pstmt.setFloat(5, rs.getFloat(6)); // latitude 
       pstmt.setFloat(6, rs.getFloat(7)); // longitude 
       pstmt.addBatch(); 
       rowCount ++; 
      } 
     } 
     int[] rowsUpdated = pstmt.executeBatch(); 
     for (int i=0; i<rowsUpdated.length; i++) { 
      if (rowsUpdated[i] == -2) { 
       logger.error("Execution {}: unknown number of rows inserted.", i); 
       logger.error("Rolling back ..."); 
       conn.rollback(savept1); 
      } else { 
       logger.trace("Successful: execution {}, {} rows updated !", i, rowsUpdated[i]); 
      } 
     } 
     conn.commit(); 
    } 
    finally { // release all open resources to avoid unnecessary memory usage. 

零件....`

谢谢!

+0

@Thomas Mueller的例子更简洁。类似的方法也可以用于[INSERT](http://h2database.com/html/grammar.html#insert)。 – trashgod 2011-03-02 11:39:28

相关问题