openCsv解析csv文件创建表并导入数据
1.添加maven依赖
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>4.6</version>
</dependency>
2.实现代码
@Override
public void addCsvDataSet(MultipartFile file, String datasourceId) throws IOException {
DatabaseInfo databaseInfo = sjztBaseDatasourceDao.getSjztBaseDatasourceById(datasourceId);
JdbcTemplate jdbcTemplate = DataSourceUtils.getJdbcTemplate(
sjztBaseDatasourceService.databaseInfoPwdDecode(databaseInfo));
int batch_count = 5000;
InputStreamReader is = new InputStreamReader(file.getInputStream(), "utf-8");
CSVParser csvParser = new CSVParserBuilder().withSeparator(',').build();
CSVReader csvReader = new CSVReaderBuilder(is).withCSVParser(csvParser).build();
String[] headStrs;
headStrs = csvReader.readNext();
StringBuilder sb = new StringBuilder();
sb.append("create table ").append(dataSet.getTableName()).append(" ( ");
for(int i = 0;i<headStrs.length;i++){
sb.append(headStrs[i]).append(" ").append("TEXT,");
}
sb.deleteCharAt(sb.length() - 1);
sb.append(" )");
log.info(sb.toString());
jdbcTemplate.execute(sb.toString());
String[] dataStr;
List<Object[]> csvList = new ArrayList<>();
StringBuilder insertSql = new StringBuilder();
insertSql.append(" INSERT INTO ");
insertSql.append(dataSet.getTableName());
insertSql.append(" (");
StringBuilder columnSql = new StringBuilder();
StringBuilder paramSql = new StringBuilder();
for(int i = 0 ; i< headStrs.length ; i ++){
columnSql.append(",");
columnSql.append(headStrs[i]);
paramSql.append(",");
paramSql.append("?");
}
insertSql.append(columnSql.substring(1));
insertSql.append(") VALUES (");
insertSql.append(paramSql.substring(1));
insertSql.append(")");
while((dataStr = csvReader.readNext())!=null){
csvList.add(dataStr);
if (csvList.size() >= batch_count) {
log.info("{}条数据,开始存储数据库!", csvList.size());
jdbcTemplate.batchUpdate(insertSql.toString(),csvList);
log.info("存储数据库成功!");
csvList.clear();
}
}
if(csvList.size()>0) jdbcTemplate.batchUpdate(insertSql.toString(),csvList);
}