【问题标题】:Java/Android CSV to SQLite technical issueJava/Android CSV 到 SQLite 技术问题
【发布时间】:2014-01-03 16:52:07
【问题描述】:

我从 csv 中的客户端获得了一个相当大的数据集,我需要将其转换为 Android 中的 sqlite。所以我有一个我写的方法来做到这一点-

db.beginTransaction();    
while ((line = bufRdr.readLine()) != null) {
        try {
            insertValues = line.split(",");

            if (flag_is_header) {
                row = this.insertRow(insertValues[0], insertValues[1], insertValues[2], insertValues[3], insertValues[4]);

            } else {
                flag_is_header = true; //so it skips the first line
            }
        } catch (Exception e) {
            Log.e(TAG,"row# "+row+" error");
        }

    }
    db.setTransactionSuccessful();
    db.endTransaction();

而且效果很好。在 5 秒内插入 9k 行。

问题是某些数据在单元格内有换行符。即这个-

Steps needed
1 .....
2 .....
3 .....

可以是一个单元格的值,所以当我的循环遇到换行符(在单元格内)时,它认为要插入一个新行并破坏代码。

是否有其他方法可以导入数据而不是使用换行符,或者我应该完全做其他事情吗?

感谢您的帮助

ps。出于后勤原因,我无法预填充数据库并发送它。

【问题讨论】:

    标签: java android sqlite csv line-breaks


    【解决方案1】:

    在导出时,您可以用(比方说)制表符(或奇怪字符的组合,如“§#§”)替换单元格中的换行符。
    然后,在重新导入时,再次用换行符替换制表符

    [编辑]

    哦,它来自 Excel……很好。那就更好了!!
    您可以导出单元格被“”包围的行。
    通过这样做,您可以知道什么属于单元格,哪个是真正的行终止符。
    导入时,只需删除多余的引号即可。

    [编辑]

    在excel中,当你导出为csv时,你可以选择保存“引用”的单元格,这样所有的单元格都会被引用。

    喜欢:

    "CellA1", "CellA2", "This is a cell with spaces", "CellA4"
    "CellB1", "CellB2", "CellB3", "This is a cell
    with
    carriage returns"
    

    如果您选择这样做,它会在导出时自动进行

    【讨论】:

    • 我喜欢它。 excel有没有办法做到这一点?
    • 我明白了。你的意思是在末尾添加一列“”?还是有更好的方法?
    • 导出时我该怎么做?我只找到了这个宏-support.microsoft.com/kb/291296/en-us 我需要一种比宏更简单的方法。客户端必须能够轻松地将更新的 csv 推送给用户
    • 好的,请参阅 this 以“通过替换”而不是使用宏来做到这一点。
    • 谢谢。我认为我使用 Scanner.useDelimiter("%%").next() 而不是 Buffered reader 并在最后一个单元格中使用 %% 来表示换行符。
    猜你喜欢
    • 1970-01-01
    • 2023-01-04
    • 2020-02-23
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多