[英]How to create a h2 database from some fields of a CSV file
我想從CSV文件創建一個新的嵌入式h2數據庫。 這是csv文件的片段
國家,城市,AccentCity,地區,人口,經緯度
廣告,aixovall,Aixovall,06,42.4666667,1.4833333
廣告,安道爾,安道爾,07,42.5,1.5166667
ad,andorra la vella,Andorra la Vella,07,20430,42.5,1.5166667
廣告,安道爾 - VIEILLE,安道爾 - 維埃耶,07,42.5,1.5166667
廣告,安道爾,安道爾,07,42.5,1.5166667
我不想檢索csv文件的所有字段。 實際上,除了城市和地區以外,我都想要它們。
此外,我想只在POPULATION的內容不為空的情況下才將csv文件的內容插入到數據庫中。
因此,在上面的csv示例中,我們只能將第3行插入到h2表WORLDCITIES中,因為它的'population'字段已被指示。
這是我寫的一段代碼。 但是,正如您所看到的,還不夠:
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類型創建字段,但我想要這樣的事情:
國家/地區(3),ACCENTCITY VARCHAR(40),人口浮動,緯度浮動,縱向浮動
在此先感謝您的幫助。
您可以在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;
最后,我按你所說的那樣繼續這樣做。 我只把我認為與問題更相關的代碼部分放在:)
`
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.
....`
謝謝!
使用H2類Csv
的read()
方法,並遍歷ResultSet
,在找到它們時插入所需的行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.