使用Java将数据从CSV导入SQLite表

时间:2017-04-18 02:38:47

标签: java sqlite csv

我有一个带有500K条记录的.csv文件,其中每条记录都有4列。我希望将所有这些记录导入Java(JDBC)中的SQLite表。

我尝试过使用executeUpdate()executeBatch(),但这两个都非常慢。他们每分钟处理400-500条记录。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.sql.*;

public class MyClass{
    public static void main(String[] args) throws FileNotFoundException, ParseException, SQLException, ClassNotFoundException{
              Connection c = null;
              Statement stmt = null;
             try {
                     Class.forName("org.sqlite.JDBC");
                     c = DriverManager.getConnection("jdbc:sqlite:mydb.db");
                     stmt = c.createStatement();
                     String drop_sql = "DROP TABLE IF EXISTS MyTable";
                     stmt.executeUpdate(drop_sql);
                     String create_sql = "CREATE TABLE MyTable " +
                             "(VAR1     CHAR(50) NOT NULL, " +
                             "VAR2 CHAR(10) PRIMARY KEY NOT NULL," +
                             " VAR3   TEXT   NOT NULL, " +
                             " VAR4      TEXT   NOT NULL )";

                     stmt.executeUpdate(create_sql);
                     File premFile = new File("MyFile.csv");
                     DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
                     Scanner scanner = new Scanner(premFile);
                     scanner.useDelimiter(",");
                     int i = 0, count = 500000;

                     while (i < count){
                             String myRecord = scanner.nextLine();
                             String[] cols = myRecord.split(",");
                             String var1 = cols[0];
                             String var2 = cols[1];
                             Date var3 = df.parse(cols[2]);
                             Date var4 = df.parse(cols[3]);

                             String query = "INSERT INTO MyTable VALUES (" +
                                     "'" + var1 + "', " +
                                     "'" + var2 + "', " +
                                     "'" + var3 +  "', " +
                                     "'" + var4 + "')";
                             stmt.addBatch(query);
                             i++;
                     }
                     stmt.executeBatch();
                     stmt.close();
                     c.close();
             } catch ( Exception e ) {
                     System.err.println( e.getClass().getName() + ": " + e.getMessage() );
                     System.exit(0);
             }
     } 
}

如果我采用SQLite方式,并使用.import my_file.csv my_table将csv导入表中,我会在几秒钟内完成完整任务。有没有办法通过仅使用Java代码来实现类似的性能?

我尝试了PreparedStatement,但没有明显的改进。

1 个答案:

答案 0 :(得分:1)

我认为你最大的问题可能是你在每次迭代时回到文件中,我会尝试将这些行加载到数组中并从那里进行处理。

P.S。您可能不想在使用scanner.useDelimiter(",")时使用scanner.nextLine(),而不是scanner.next()。我相信这没有任何作用,虽然我这样说可能不正确,试一试。