2014-01-15 151 views
0

我读这个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);是有罪的。只要删除它。

+0

您确定CSV文件底部没有空行吗? – Yjay

+0

是的,我已经检查过了(这是首先想到的)。 –

+1

您是否已经将系统放在您的循环中,以便您可以清楚地看到它在解析什么以及循环在java端运行了多少次?也有可能你的表已经有了一个条目吗? –

回答

1

不是很确定,但我认为db.execSQL(查询)是导致您的额外行的那个。

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

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

+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(); 
    } 
+0

我也试过。但同样的情况发生。也许这是一个Android相关的问题?我不知道。 –

+0

您是否尝试打印该行,是否打印空行?如果长度为零,则无法继续。 – Vaandu

+0

不,它打印7行。那是因为我在想我的方法是正确的。 –