【问题标题】:Importing a CSV file in Java在 Java 中导入 CSV 文件
【发布时间】:2011-06-23 05:30:40
【问题描述】:

我目前正在开发一个需要在 Java 中读取 CSV 文件的程序。现在我已经正确加载了文件,这不是问题,我想将用户信息从 csv 文件添加到数据库中。但是它作为一个价值列表出现。以下是我的文件格式

first_name1, last_name1,(group1,group2,group3)
first_name2, last_name2,(group1,group2,group3)

所以想添加到数据库中

firstname1,lastname1,group1
firstname1,lastname1,group2
firstname1,lastname1,group1
firstname2,lastname2,group1
...

那么我应该如何拆分所有这些并存储在数据库中?

该文件有一系列我想放入数据库的记录,所以如果有人对此也有任何想法,请告诉我。

如有任何建议,我们将不胜感激。

【问题讨论】:

  • 遍历每个组并插入它们?您可以使用正则表达式或标准 string.split 拆分标记,并使用 for 循环进行迭代。
  • 很简单:使用现有的CSV阅读器加载文件(不是来自openbyte的,它无法处理Excel生成的CSV文件),逐行读取,将每一行转换为多条数据库记录,将每条记录保存在数据库中,关闭文件,提交数据库操作,关闭数据库连接。
  • @Mikola, Roland lllig:能否请您提供一些拆分 csv 文件的示例。基本上我想要DTO类的结构。例如字符串名字;字符串姓氏,列表组[];我怎样才能添加到这个并存储到数据库中?

标签: java database csv


【解决方案1】:
  • 读取文件(BufferedFileReader)
  • 遍历行(for-loop)
  • 将行分解为变量(StringTokenizer)
  • 组合查询(字符串)
  • 在您的数据库上执行查询 (SQL)

    public void test(String line) {
        List<String> list = new ArrayList<String>();
        StringTokenizer t1 = new StringTokenizer(line, ",");
        String firstName = (String) t1.nextElement();
        String lastName = (String) t1.nextElement();
        String temp = (String) t1.nextElement();
        temp = temp.replaceAll("(", "").replaceAll(")", "");
        List<String> usergroups = new ArrayList<String>();
        StringTokenizer t2 = new StringTokenizer(temp, ",");
        while (t2.hasMoreElements()) {
            String element = (String) t2.nextElement();
            usergroups.add(element);
        }
    }
    

【讨论】:

  • @molske:能否请您提供一些拆分 csv 文件的示例。基本上我想要DTO类的结构。例如字符串名字;字符串姓氏,列表组[];我怎样才能添加到这个并存储到数据库中?
  • 快速(未经测试)版本以获取如何处理它的提示
  • @molske: 以下行“List list = new ArrayList();”的用途
  • 这是一个包含您的组的字符串列表,项目会在 while 循环中添加到其中
  • @Molske:csv 文件格式的一些变化。以下是我的文件格式 FirstName、LastName、userid、role、group1、group2、group3。我想将其拆分并存储到名字、姓氏、角色和组变量列表中。那么如何拆分组并存储到组列表中。我们使用逗号作为分隔符来分割数据。
【解决方案2】:

有一个名为opencsv 的库可以为您完成所有繁重的工作。它会自动处理双引号中的嵌入逗号等问题。

maven依赖定义为:

    <dependency>
        <groupId>net.sf.opencsv</groupId>
        <artifactId>opencsv</artifactId>
        <version>2.1</version>
    </dependency>

我用过,可以推荐。

【讨论】:

  • 感谢这个有趣的新事物。您能否提供更多详细信息或示例。基本上我想将所有这些用户信息分配给我的 userDTO 类。那么我如何为此创建 DTO 并将所有这些值分配给 userDTO 类并存储到数据库中
【解决方案3】:

您应该查看 openCSV。它们支持 javabeans 映射,可以让您命名列并将其映射到您的 DTO:http://opencsv.sourceforge.net/#javabean-integration 我看到的一个问题是您在括号中使用的组嵌套。 如果您对文件的生成有任何控制权,我会将 '(' 和 ')' 内的分隔符替换为逗号以外的东西。这样,您的 CSV 解析器可以在第一遍中忽略这些解析器。你会有一个像这样的bean:

firstname: John
lastname: Doe
tempGroups: (group1;group2)

然后您可以使用

轻松拆分组
String[] groups = tempGroups.split("[();]")

要将其放入数据库中,请遍历 bean 的集合,对于每个 bean,遍历组的集合以添加每个单独的用户及其组。

for (User user:Users) {
   for  (String group:user.getGroups()) {
       db.insert(user.getFirstname(), user.getLastName(), group);
   }
}

【讨论】:

  • @bohemian:感谢这个有趣的新事物。您能否提供更多详细信息或示例。基本上我想将所有这些用户信息分配给我的 userDTO 类。那么我如何为此创建 DTO 并将所有这些值分配给 userDTO 类并存储到数据库中
  • 我应该如何为 User.In 用户创建 DTO 类,包括以下详细信息 firstname、lastname、lastname.role、group1#group#group3。所以基本上角色由 group1,group2,group3 组成。
猜你喜欢
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 2021-09-02
  • 2017-04-20
  • 2017-11-18
  • 2013-07-24
  • 2017-08-05
  • 2012-08-14
相关资源
最近更新 更多