将多个.csv文件导入android sqlite数据库

时间:2014-05-08 06:01:15

标签: android sqlite csv import

我现在正试图从Android设备导入sd卡中某个目录的csv文件。最近,我可以成功导入单个csv文件。但是,我没有想法如何获取所有csv文件的列表,然后使用循环逐个导入csv文件。

这是我导入单个csv的代码:

button_import_csv.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){


            DatabaseHelper helper = new DatabaseHelper(getApplicationContext());
            SQLiteDatabase db = helper.getWritableDatabase();


            try{
                FileReader file = new FileReader("/sdcard/downloadedfolder/A1/adv_sales_order.csv");
                BufferedReader buffer = new BufferedReader(file);
                ContentValues contentValues=new ContentValues();
                String line = "";
                String tableName ="adv_sales_order";

                db.beginTransaction();
                while ((line = buffer.readLine()) != null) {
                    String[] str = line.split("\t");


                    contentValues.put("order_date", str[0]);
                    contentValues.put("cust_code", str[1]);
                    contentValues.put("customer_ref_no", str[2]);
                    contentValues.put("line_no", str[3]);
                    contentValues.put("item_code", str[4]);
                    contentValues.put("tran_code", str[5]);
                    contentValues.put("order_qty", str[6]);
                    db.insert(tableName, null, contentValues);

                }
                db.setTransactionSuccessful();
                db.endTransaction();
            }catch (IOException e){

            }
        }
    });

不同csv文件的列不一样。(例如,有些列可能有4列,名为A,B,C,D,另一列可能有列为C,D,E,F)除了硬盘外编码每个csv文件的所有列,有什么可能的方法吗? 谁能告诉我任何解决方案???谢谢。

1 个答案:

答案 0 :(得分:0)

我可以想到两种可能性......

首先:如果你控制文件名然后给它们带有顺序数字方面的名称,例如file1.csv,file2.csv等你可以简单地使用for循环来构建文件名和处理它们。实施例...

// Lets say you have 5 files named file1.csv thru file5.csv
for(int i = 1; i < 6; i++) {
    String filename = "file" + i + ".csv";
    // Process the file which has the above filename
}

第二:使用listFiles()方法获取目录中的所有文件。实施例...

// This code assumes you have a File object for the directory called dir
File[] files = dir.listFiles();
for(int i = 0; i < files.length; i++) {
    String filename = files[i].getAbsolutePath();
    if (filename.endsWith(".csv")) {
        // Process the file which has the above filename
    }
}

我不确定上面的代码块是否完美,但基本上它们都只使用for循环。还有其他方法,但那些是最直接的。

编辑: 一些csv文件使用第一行来描述列名。在某些方面,这有点像数据集的模式。示例(使用逗号分隔值)...

A,B,C,D
valueA,valueB,valueC,valueD
...

使用此方法意味着您可以通过读取第一行并将其拆分为一个数组来访问列名。然后,您可以使用for循环来放置ContentValues。请尝试以下方法......

// Read the first line separately and split to get the column names
line = buffer.readLine();
String[] cols = line.split("\t");
db.beginTransaction();
while ((line = buffer.readLine()) != null) {
    String[] str = line.split("\t");

    for (int i = 0; i < cols.length; i++) {
        contentValues.put(cols[i], str[i]);
    }
    db.insert(tableName, null, contentValues);
}
db.setTransactionSuccessful();
db.endTransaction();

BTW我注意到你在"\t"上拆分了,所以请确保第一行的列名是制表符分隔的(显然)。