【问题标题】:Generic CSV read and load code通用 CSV 读取和加载代码
【发布时间】:2016-11-12 14:40:00
【问题描述】:

我想在java中实现以下:

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

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

这里的 csvPath 和 csvFileName 是不言自明的,但是这里的 csvType 是获取 csv 对应的表名。例如:如果 csvType 是员工,则意味着此 csv 包含员工数据和员工数据特定的标题。

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

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

【问题讨论】:

  • 您有任何示例 csv 文件结构吗?
  • Switch 机箱有帮助吗?
  • 标题名称应在 CSV 文件中...

标签: java csv


【解决方案1】:

如果 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 匹配了一个实体,你就有了标题和表格,你可以简单地阅读它或者通过你自己的逻辑或方法将它加载到表格中(你现在知道了)。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-07
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      相关资源
      最近更新 更多