【问题标题】:Reading CSV file in Java: extra line用 Java 读取 CSV 文件:额外的一行
【发布时间】:2014-01-15 20:28:01
【问题描述】:

我正在阅读此 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); 是有罪的。只需将其删除。

【问题讨论】:

  • 您确定 CSV 文件的底部没有空行吗?
  • 是的,我已经检查过了(这是我首先想到的)。
  • 您是否在循环中放置了一个系统,以便您可以准确地看到它正在解析什么以及循环在 java 端运行了多少次?还有可能您的表中已经有一个条目吗?
  • 你试过FileReaderwhile ((line = fileReader.hasNextLine()) != null) 吗?它可能是一个简单的换行符导致额外的行。
  • 实际上我认为这是与 Android 相关的问题。我在循环中放了一个 Log.v(),出现了 7 行。

标签: java android csv


【解决方案1】:

不太确定,但我认为 db.execSQL(query) 是导致额外行的原因。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我也试过了。但同样的情况也会发生。也许这是一个与Android相关的问题?我不知道。
    • 您是否尝试打印该行,它是否打印空行?如果长度为零,则无法继续。
    • 不,它打印 7 行。那是因为我认为我的方法是正确的。
    • 您是否尝试先将 csv 文件读入列表,然后再将其插入数据库?这可能是开销,但至少您可以检查列表中的 Strings 或跳过最后一行
    • 所以 stmt.execute();只执行了 7 次。然后“db.execSQL(query);”做什么?这是添加空行吗?
    猜你喜欢
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多