2014-01-15 49 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行。那是因爲我在想我的方法是正確的。 –