将.csv文件导入Android中的Sqlite

Mar*_*.F. 27 database csv sqlite import android

我有一个.csv文件,我想将这个文件导入到android中的数据库中.

例如,.csv文件:

| id | name  | dt1 | dt2 | dt3 | 
| 1  | Paul  | 21  | 98  | 91  |
| 2  | John  | 22  | 44  | 11  |
| 3  | George| 21  | 31  | 22  |
| 4  | Ringo | 20  | 10  | 15  | 
Run Code Online (Sandbox Code Playgroud)

对于这样的事情:

Cursor cursor = getWritableDatabase().
rawQuery("Insert into table1(_id, name, dt1, dt2, dt3)
values ( 1, Paul, 21, 98, 91)
values ( 2, John, 22, 44, 11)
values ( 3, George, 21,31,22)
values ( 4, Ringo, 20, 10,15);");
Run Code Online (Sandbox Code Playgroud)

那么,请问我该怎么做?

Chi*_*hod 40

试试以下代码,

FileReader file = new FileReader(fileName);
BufferedReader buffer = new BufferedReader(file);
String line = "";
String tableName ="TABLE_NAME";
String columns = "_id, name, dt1, dt2, dt3";
String str1 = "INSERT INTO " + tableName + " (" + columns + ") values(";
String str2 = ");";

db.beginTransaction();
while ((line = buffer.readLine()) != null) {
    StringBuilder sb = new StringBuilder(str1);
    String[] str = line.split(",");
    sb.append("'" + str[0] + "',");
    sb.append(str[1] + "',");
    sb.append(str[2] + "',");
    sb.append(str[3] + "'");
    sb.append(str[4] + "'");
    sb.append(str2);
    db.execSQL(sb.toString());
}
db.setTransactionSuccessful();
db.endTransaction();
Run Code Online (Sandbox Code Playgroud)

  • 实际上我不明白我应该写什么`FileReader file = new FileReader(fileName);`for if csv在文件夹或资产文件夹中下载.我试着这个代码`AssetFileDescriptor descriptor = getAssets().openFd("myfile.csv"); 读者的FileReader =新的FileReader(descriptor.getFileDescriptor());`,但它给错误**产生的原因:java.io.FileNotFoundException:该文件无法打开的文件描述符; 它可能是压缩的** (2认同)
  • @mehmet你可以这样做.`InputStream为= getAssets()打开( "myfile.csv");`然后`的BufferedReader BR =新的BufferedReader(新的InputStreamReader(是, "UTF-8"));` (2认同)

Jan*_*hou 11

我建议使用ContentValues插入记录.它更容易,将逃避引用,并且不那么冗长.

像这样,(它也会跳过坏线):

 ...
 BufferedReader buffer = new BufferedReader(new InputStreamReader(inStream));
 String line = "";
 db.beginTransaction();
        try {
            while ((line = buffer.readLine()) != null) {
                String[] colums = line.split(",");
                if (colums.length != 4) {
                    Log.d("CSVParser", "Skipping Bad CSV Row");
                    continue;
                }
                ContentValues cv = new ContentValues(3);
                cv.put(dbCol0, colums[0].trim());
                cv.put(dbCol1, colums[1].trim());
                cv.put(dbCol2, colums[2].trim());
                cv.put(dbCol3, colums[3].trim());
                cv.put(dbCol4, colums[4].trim());
                db.insert(TABLE, null, cv);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
   db.setTransactionSuccessful();
   db.endTransaction();
Run Code Online (Sandbox Code Playgroud)

dbCol0等是数据库的列名,例如_id, name, dt1, dt2, dt3.

db是您public SQLiteDatabase getReadableDatabase ()SQLiteOpenHelper中获得的数据库

如何阅读CSV文件

file.csv复制到assets文件夹中,并按如下方式读取:

String mCSVfile = "file.csv";
AssetManager manager = context.getAssets();
InputStream inStream = null;
try {
     inStream = manager.open(mCSVfile);
    } catch (IOException e) {
     e.printStackTrace();
    }

 BufferedReader buffer = new BufferedReader(new InputStreamReader(inStream));
...
Run Code Online (Sandbox Code Playgroud)