![](/img/trans.png)
[英]What's the most efficient way to load data from a file to a collection on-demand?
[英]MySQL, Most efficient Way to Load Data from a parsed file
我的文件具有以下格式:
Table1; Info
rec_x11;rec_x21;rec_x31;rec_x41
rec_x12;rec_x22;rec_x32;rec_x42
...
\n
Table2; Info
rec_x11;rec_x21;rec_x31;rec_x41
rec_x12;rec_x22;rec_x32;rec_x42
...
\n
Table3; Info
rec_x11;rec_x21;rec_x31;rec_x41
rec_x12;rec_x22;rec_x32;rec_x42
...
从TableX标头后的下一行开始,以空行定界符结束的每批记录的大小约为700-800行。
每行这样的批处理( rec_xyz
...)需要导入到批处理( TableX
)标题中指示的相关MyISAM表名中。
我熟悉使用外壳命令将流传输到LOAD DATA命令的选项。
我对简单的Java snipet代码感兴趣,该代码将解析此文件并每次都对单批记录执行LOAD DATA(在for循环中,也许使用seek命令)。
现在,我正在尝试使用IGNORE LINES跳过已处理的记录,但是我不熟悉是否可以忽略BELOW下的行?
有没有更有效的方法来解析这种类型的文件并将其加载到数据库中?
编辑
我已经读过JDBC从5.1.3开始支持LOAD DATA
输入流,我可以用它来遍历带有输入流的文件并每次更改LOAD DATA
语句吗?
我附上我的代码作为解决方案,
该解决方案基于MySQL Connector / J 5.1.3及更高版本添加的附加功能 ( setLocalInfileInputStream
)。
我将输入流通过管道传递到LOAD DATA INTO
语句中,而不是使用直接文件URL。
附加信息:我正在使用BoneCP作为连接池
public final void readFile(final String path)
throws IOException, SQLException, InterruptedException {
File file = new File(path);
final Connection connection = getSqlDataSource().getConnection();
Statement statement = SqlDataSource.getInternalStatement(connection.createStatement());
try{
Scanner fileScanner = new Scanner(file);
fileScanner.useDelimiter(Pattern.compile("^$", Pattern.MULTILINE));
while(fileScanner.hasNext()){
String line;
while ((line = fileScanner.nextLine()).isEmpty());
InputStream is = new ByteArrayInputStream(fileScanner.next().getBytes("UTF-8"));
String [] tableName = line.split(getSeparator());
setTable((tableName[0]+"_"+tableName[1]).replace('-', '_'));
String sql = "LOAD DATA LOCAL INFILE '" + SingleCsvImportBean.getOsDependantFileName(file) + "' "
+ "INTO TABLE " + SqlUtils.escape(getTable())
+ "FIELDS TERMINATED BY '" + getSeparator()
+ "' ESCAPED BY '' LINES TERMINATED BY '" + getLinefeed() + "' ";
sql += "(" + implodeStringArray(getFields(), ", ") + ")";
sql += getSetClause();
((com.mysql.jdbc.Statement) statement).setLocalInfileInputStream(is);
statement.execute(sql);
}
}finally{
statement.close();
connection.close();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.