用Java读取CSV文件:额外的行

时间:2014-01-15 20:28:02

标签: java android csv

我正在读这个CSV:

A;San Antonio;Tercer Barrio
B;Camino de la Miranda;Campus
C;San Lázaro;Cementerio
E;Cristo;H. Río Carrión
H;H. San Telmo;H. Río Carrión
M;Plaza de León;Monte el Viejo
P;Allende el Río;Campus

我希望使用此方法在Android中填充SQLite数据库:

private void insertRoutes(SQLiteDatabase db) {
  try {
     BufferedReader reader = new BufferedReader(
             new InputStreamReader(context.getAssets().open(SQL_FILE_ROUTES)));

     String query =
             "insert into routes (name, rfrom, rto) values (?, ?, ?)";

     db.beginTransaction();
     SQLiteStatement stmt = db.compileStatement(query);
     String line;

     while ((line = reader.readLine()) != null) {
        String[] dic = line.split(";");
        stmt.bindString(1, dic[0]);
        stmt.bindString(2, dic[1]);
        stmt.bindString(3, dic[2]);
        stmt.execute();
        stmt.clearBindings();
     }
     db.execSQL(query);
     db.setTransactionSuccessful();

  } catch (IOException e) {
     e.printStackTrace();
  } finally {
     db.endTransaction();
  }
}

它“工作”,我的数据库被填充,但有和额外的行。这是我检查sqlite数据库时的结果:

sqlite> select * from routes;
1|A|San Antonio|Tercer Barrio
2|B|Camino de la Miranda|Campus
3|C|San Lázaro|Cementerio
4|E|Cristo|H. Río Carrión
5|H|H. San Telmo|H. Río Carrión
6|M|Plaza de León|Monte el Viejo
7|P|Allende el Río|Campus
8|||

有8行,但CSV文件只有7行。我做错了什么? 感谢。

修改

我已检查过该文件。它有7行:

wc default_android_routes.csv 
7  25 198 default_android_routes.csv

修改

就像@flopo所说,db.execSQL(query);是有罪的。只需删除它。

2 个答案:

答案 0 :(得分:1)

CSV可能有空行,请检入文本栏。尝试选择整个文本文件,看看下一行是否也被选中。

您可以这样做以避免空行。

while ((line = reader.readLine()) != null) {
        if (line.trim().length() == 0) { // this will check empty line
             break;
        }
        String[] dic = line.split(";");
        stmt.bindString(1, dic[0]);
        stmt.bindString(2, dic[1]);
        stmt.bindString(3, dic[2]);
        stmt.execute();
        stmt.clearBindings();
     }

答案 1 :(得分:1)

不太确定,但我认为db.execSQL(查询)是引起额外行的那个。

在while循环中,为每一行执行语句。在循环之外,您不需要再次执行查询。

正如我所说,我没有使用过SQLiteDatabase,但我认为这就是你遇到的问题。