通用CSV读取和加载代码

时间:2016-11-12 14:40:01

标签: java csv

我想在java中实现以下功能:

具有根据提供的参数数量读取具有不同列数的不同csv文件的方法的类。例如:

public boolean readAndLoad(String csvPath,String csvFileName, String csvType);

这里csvPath和csvFileName是自解释的,但这里的csvType是获取与csv对应的表名。例如:如果csvType是employee,则表示此csv包含具有员工数据特定标题的员工数据。

现在我想创建一个通用的泛型方法或类的组合,可以执行此操作并将不同的csv加载到不同的表。列数将在每个csv中不同。

一种可能的解决方案是在方法中手动检查文件名,然后获取与该csv对应的静态标题列表并在表中插入数据。将来会有很多if else检查。还有其他方法吗?

2 个答案:

答案 0 :(得分:0)

如果csvType应该与您的某个实体的名称匹配,我建议首先从其包中标识该实体:

String packageName="com.your.entities";
           ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            URL packageURL;
            ArrayList<String> classesNames = new ArrayList<String>();;
            packageName = packageName.replace(".", "/");
            packageURL = classLoader.getResource(packageName); 
            URI uri = new URI(packageURL.toString());
            File folder = new File(uri.getPath());
                File[] file = folder.listFiles();
                String className;
                for(File actual: file){
                    className = actual.getName();
                    className = className.substring(0, className.lastIndexOf('.'));
                    classesNames.add(className);}

一旦你的实体快速查看csvType是否匹配其中一个,如果是,你应该得到你的标题的字段数,当然还有字段名称:

 packageName = packageName.replace("/", ".");
                   int headerLengh;
                   String header="";
                   for (String name :classesNames)
                   {
                       if(name.equals(csvType))
                       { headerLengh=Class.forName(packageName+"."+name).getDeclaredFields().length;

                       for (int i=0;i<headerLengh;i++)
                       {
                           header=header+Class.forName(packageName+"."+name).getDeclaredFields()[i].getName()+" ";

                       }}}

一旦你的csvType与一个实体匹配,你就有了标题和表格,你可以简单地阅读它或者通过你自己的逻辑或方法将它加载到表格中(你现在知道)。

答案 1 :(得分:0)

只需使用univocity-parsers即可完成工作。它功能齐全,速度非常快。如果需要将数据映射到特定类的对象,则可以在其属性上声明带有注释的类,以指示字段名称/位置。如果需要,也可以很好地支持类的层次结构。

如果您只需要为每个可能的输入提供标题,您将找到一个setHeaders方法,允许您将任何标题列表分配给输入。您还可以调用selectFields方法来选择要读取的字段和要忽略的字段。