当前位置: 首页 > 知识库问答 >
问题:

通用CSV读取和加载代码

钮出野
2023-03-14

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

一个类,具有根据提供的参数数量读取不同列数的不同csv文件的方法。对于ex:

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

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

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

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

共有2个答案

辛建业
2023-03-14

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

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

汤才捷
2023-03-14

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

 类似资料:
  • 我是python编程/数据科学家领域的新手。我使用Pycharm和MacOs。出于学习目的,我从Kaggle下载了一些CSV文件,我总是能够将它们加载到Pycharm中。但实际上我无法从我的工作环境中加载csv文件,令人惊讶的是,我可以使用R函数'fread'加载该文件,但我的目标是将其加载到python中。请在下面查找代码和错误: 代码: 错误: “/Users/oscargonzalez-ll

  • 我在尝试生成一个简单DF的共线性分析时遇到了问题(见下文)。我的问题是,每次尝试运行该函数时,都会检索到以下错误消息: 下面是我正在使用的代码 我试图运行函数的DF如下所示。 我在这里有两个猜测;但不知道如何解决这个问题: -猜测1:np。arrange导致与标头发生某种冲突 -猜想2:问题来自blankseperator,它阻止函数正确地从一列跳转到另一列。问题是,我的CSV文件已经有分隔符(我

  • 我正在通过Spark使用以下命令读取csv文件。 我需要创建一个Spark DataFrame。 我使用以下方法将此rdd转换为spark df: 但是在将rdd转换为df时,我需要指定df的模式。我试着这样做:(我只有两列文件和消息) 然而,我得到了一个错误:java。lang.IllegalStateException:输入行没有架构所需的预期值数。需要2个字段,但提供1个值。 我还尝试使用以

  • 问题内容: 我的csv正在读入System.out,但是我注意到任何带空格的文本都移到下一行(作为返回\ n) 这是我的csv的启动方式: 运行我的应用程序后,任何带有空格(地址1)的单元格都将扔到下一行。 因此,这是控制台中的结果: 我使用扫描仪的方式有误吗? 问题答案: 这应该工作。 对于CSV文件: 输出为:

  • 问题内容: 我正在尝试根据我已经拥有的csv检查提取数据的值。它只会循环遍历CSV的行一次,我只能检查feed.items()的一个值。我需要在某个地方重置值吗?有没有更好/更有效的方法来做到这一点?谢谢。 问题答案: 您可以通过重置文件对象的读取位置来“重置” CSV迭代器。