使用场景:自动将某个路径下的所有csv文件在数据库中自动创建对应的表,并且将文件中的数据自动导入到数据库中。
本文使用sqlite原生语句添加
本文使用了blankj的方法,不得不说这个确实很方便:
地址:mirrors / Blankj / AndroidUtilCode · GitCode
1、首先是获取文件夹下所有csv的文件,并且过滤不需要的文件,返回文件名列表,返回的文件名包括.csv
/** * 获取Archives文件夹下所有csv结尾的文件名 * @return List<String> */ public static List<String> getAllArchiveName(){ List<String> fileName = new ArrayList<>(); List<File> filelist = FileUtils.listFilesInDir(new File(ConstantConfig.AppArchivePath)); Log.i(TAG,"creatDbTab filelist:"+filelist.size()); for (int i=0;i<filelist.size();i++){ //判断是不是other文件 if (filelist.get(i).getName().toLowerCase().contains("other")){ Log.i("getAllArchiveName","检测到other文件,不进行处理"+filelist.get(i).getName());// 输出一行数据 }else{ if (filelist.get(i).getName().contains(".csv")){ fileName.add(filelist.get(i).getName()); } } } return fileName; }
2、由于csv文件第一行是由逗号隔开的字段名,所以可以通过传入一个文件路径,将第一行的字段名存入list与截取出来的文件名作为表名一起返回
public static Pair<String,List<String>> creatWtsSqlFile(String filePath){ Log.i(TAG,"creatWtsSqlField filePath:"+filePath); Pair<String, List<String>> sqlpair = null; //判断文件是否存在 if (!FileUtils.isFileExists(filePath)){ return null; } //使用文件名作为表名 String fileName = filePathToName(filePath); try { File wts = new File(filePath); InputStreamReader isr = new InputStreamReader(new FileInputStream(wts), "GBK"); BufferedReader br = new BufferedReader(isr); String first = br.readLine(); String buffer[] = first.split( ",");// 以逗号分隔 List<String> resultList = new ArrayList<>(buffer.length); Collections.addAll(resultList,buffer); sqlpair = new Pair<>(fileName.replace(".wts","").toLowerCase(), resultList); } catch (IOException e) { e.printStackTrace(); } return sqlpair; }
3、下面将上面两个方法返回的内容,进行处理,组合成创建数据库表的sql语句,并传入数据库操作方法中。
/** * 根据所有档案创建数据库表结构 */ public void creatDbTab() { ArrayList<String> creatSqlList = new ArrayList<>(); List<Pair<String, List<String>>> TabNamePairList = new ArrayList<>(); List<String> fileNameList = ArchivesUtils.getAllArchiveName(); //将目录下所有文件的表名与字段名放入list中 for (String fileName : fileNameList) { Pair<String, List<String>> sqlpair = ArchivesUtils.creatWtsSqlFile(ConstantConfig.AppArchivePath + fileName, myDBHelper); if (null!=sqlpair){ TabNamePairList.add(sqlpair); } } Log.i("initCreatSql", "TabNamePairList.size: " + TabNamePairList.size()); try { //循环list,将不同文件的文件名与字段名组合成创建表的sql,然后传入数据库操作方法中 for (Pair<String, List<String>> tabPair : TabNamePairList) { if (null!=tabPair&&null!=tabPair.first&&null!=tabPair.second){ String creatSql = "CREATE TABLE " + tabPair.first + "(" + " id integer primary key autoincrement"; for (int i = 0; i < tabPair.second.size(); i++) { creatSql = creatSql + ",'" + tabPair.second.get(i) + "' TEXT"; } creatSql = creatSql + ")"; creatSqlList.add(creatSql); Log.i("initCreatSql", "creatSql: " + creatSql); //将sql语句传入数据库操作类中运行 creatTable(creatSql); } } } catch (SQLException e) { e.printStackTrace(); Log.e("initCreatSql", "SQLException: " + e.toString()); } finally { } }
以上就是获取csv文件的数据自动创建数据库表的实现,在得到sql语句之后就比较自由了,可以使用android原生的sqlite运行语句,也可以使用一些三方的框架运行,我这边使用的是 greendao,如果用原生还需要处理多线程并发的问题比较麻烦。