8

CSVファイルから新しい埋め込みh2データベースを作成したいと思います。これがcsvファイルのスニペットです

国、都市、アクセント都市、地域、人口、緯度、経度

ad、aixovall、Aixovall、06、、42.4666667,1.4833333

ad、andorra、Andorra、07、、42.5,1.5166667

ad、andorra la vella、Andorra la Vella、07,20430,42.5,1.5166667

ad、andorra-vieille、Andorra-Vieille、07、、42.5,1.5166667

ad、andorre、Andorre、07、、42.5,1.5166667

csvファイルのすべてのフィールドを取得したくありません。実際、CityフィールドとRegionフィールドを除くすべてが必要です。

さらに、 POPULATIONのコンテンツが空でない場合にのみ、csvファイルのコンテンツをデータベースに挿入したいと思います。

したがって、上記のcsvの例では、「population」フィールドが示されているため、h2テーブルWORLDCITIESに3番目の行のみを挿入する必要があります。

これが私が書いたコードの抜粋です。しかし、ご覧のとおり、まだ十分ではありません。

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)、POPULATION FLOAT、LATITUDE FLOAT、LONGITUDE FLOAT

助けてくれてありがとう。

4

3 に答える 3

10

文書化され ているように CREATE TABLE に列定義を追加し、これを 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;
于 2011-03-02T05:27:46.427 に答える
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.

....`

ありがとう!

于 2011-03-02T05:02:20.917 に答える
2

read()H2クラスのメソッドを使用しCsv、を繰り返してResultSet、必要な行を見つけたら挿入します。

于 2011-03-01T20:30:36.537 に答える