2011-03-01 10 views
8

के कुछ क्षेत्रों से एच 2 डेटाबेस कैसे बनाएं I CSV फ़ाइल से एक नया एम्बेडेड एच 2 डेटाबेस बनाना चाहते हैं। यहाँ csv फ़ाइल का टुकड़ा हैएक CSV फ़ाइल

देश, शहर, AccentCity, क्षेत्र, जनसंख्या, अक्षांश, देशांतर

विज्ञापन, aixovall, Aixovall, 06,, 42.4666667,1.4833333

विज्ञापन, एंडोरा, एंडोरा, 07,, 42.5,1.5166667

विज्ञापन, एंडोरा ला वेला, Andorra la Vella, 07,20430,42.5,1.5166667

विज्ञापन, एंडोरा-Vieille, एंडोरा-विले, 07,, 42.5, 1.5166667

विज्ञापन, Andorre, Andorre, 07,, 42.5,1.5166667

मैं csv फ़ाइल के सभी क्षेत्रों को पुनः प्राप्त करने नहीं करना चाहती। असल में, मैं उन्हें शहर और क्षेत्र फ़ील्ड को छोड़कर सभी को चाहता हूं।

और आगे, मैं केवल डेटाबेस में सीएसवी फ़ाइल की सामग्री डालना चाहता हूं अगर की सामग्री POPULATION खाली नहीं है।

इस प्रकार, उपरोक्त सीएसवी उदाहरण में, हमें केवल तीसरी पंक्ति को H2 तालिका विश्वव्यापी में डालना होगा क्योंकि इसकी 'आबादी' फ़ील्ड इंगित की गई है।

यहां मैंने लिखा कोड का एक स्निपेट है। लेकिन, जैसा कि आप देख सकते हैं, यह न पर्याप्त अभी तक है:

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 प्रकार का उपयोग क्षेत्र बनाने, लेकिन मैं इस तरह बातें हैं:

देश VARCHAR (3), एकाग्रता वचर (40), जनसंख्या फ्लोट, लेटिट्यूड फ्लोट, लांगिट्यूड फ्लोट

मदद के लिए अग्रिम धन्यवाद।

उत्तर

9

आप CREATE TABLE asdocumented में कॉलम परिभाषाएं जोड़ सकते हैं और इसे WHERE क्लॉज के साथ जोड़ सकते हैं। कृपया टेबल बनाएं का उपयोग कर के रूप में चयन थोड़ा अलग टेबल बनाएँ और बयानों में डालने (यकीन नहीं करता है, तो गति आप के लिए बहुत महत्वपूर्ण है) की तुलना में तेजी है ध्यान दें:

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

2

उनके मिलते ही एच 2 वर्ग Csv की read() विधि का उपयोग करें, और पुनरावृति ResultSet के माध्यम से, वांछित पंक्तियों डालने।

+0

यह संभव है, लेकिन यह कोड का एक बहुत कुछ लिखना है । –

+0

@ थॉमस म्यूएलर: इस पर टिप्पणी करने के लिए धन्यवाद; आपका दृष्टिकोण बेहतर है। – trashgod

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

@ थॉमस म्यूएलर का उदाहरण अधिक संक्षिप्त है। एक समान दृष्टिकोण का उपयोग [INSERT] (http://h2database.com/html/grammar.html#insert) के साथ भी किया जा सकता है। – trashgod

संबंधित मुद्दे