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

如何使用Java8流将csv转换为地图

范承教
2023-03-14

我正在尝试创建一个简单的解析util,它转换一个两列CSV文件并将其放入一个映射。

public Map<String, String> getMapFromCSV(final String filePath) throws IOException {
    return Files.lines(Paths.get(filePath))
                .map(line -> line.split(","))
                .collect(Collectors.toMap(line -> line[0], line -> line[1]));
}

如您所见,我正在创建一个字符串流,用逗号分隔每一行,并将其转换为字符串数组,最后将键映射到索引0,将值映射到索引1。

@Test
public void testGetMapFromCSV() throws IOException{
    actual = util.getMapFromCSV(filePath).get("AL");
    expected = "ALABAMA";

    assertEquals(expected, actual);
}

出于某种原因,当我运行这个测试时,实际值为null。我排除了无效的文件路径,因为它在另一个单元测试中运行良好,并且键值出现在CSV中。我已经盯着它看了几个小时了,我想也许有人能指出我的错误。

此外,我对Java8相当陌生,所以如果有人知道更好/更干净的写作方式,我会感谢反馈。

共有3个答案

喻珂
2023-03-14

以一种可能更容易阅读的形式使用映射

public static Map<String, String> getMapFromCSV(final String filePath) throws IOException {
  try(Stream<String> lines = Files.lines(Paths.get(filePath))) {
      return lines.collect(
        mapping(s -> s.split(","), toMap(k -> k[0], v -> v[1])));
  }
}
葛景龙
2023-03-14

正如fge所评论的那样,使用try-with资源使这变得更容易。

这是你的答案中的代码,但是使用资源试用来自动关闭一个也是AutoCloseableStream。还有一些添加了呼吸空间的空间字符。

public static Map<String, String> getMapFromCSV(final String filePath) throws IOException{

    try (
        Stream < String > lines = Files.lines( Paths.get( filePath ) );
    )
    {
        Map < String , String > resultMap = 
                lines.map( 
                         line -> line.split( "," ) 
                     )
                     .collect(
                         Collectors.toMap( line -> line[0] , line -> line[1] )
                     );
        return resultMap;
    }
    // The `Stream` named `lines` is automatically closed at this point by the try-with-resources.
}

当使用资源尝试的{…}块结束时,在try中打开的所有资源都会自动关闭,顺序与打开顺序相反。无论控制流是在完成时优雅地离开块,还是由于异常或返回而突然离开块(如代码中所示),都是如此。请参阅关于这个问题的讨论,尝试使用java中的参考资料和返回语句。

庄阿苏
2023-03-14

好的,我添加了行。close()并从csv中删除所有空白,它就可以工作了!奇怪的是,考虑到csv在我的另一种方法中得到了很好的解析。下面是它的样子:

public static Map<String, String> getMapFromCSV(final String filePath) throws IOException{

        Stream<String> lines = Files.lines(Paths.get(filePath));
        Map<String, String> resultMap = 
                lines.map(line -> line.split(","))
                     .collect(Collectors.toMap(line -> line[0], line -> line[1]));

        lines.close();

        return resultMap;
    }
 类似资料:
  • 问题内容: 我需要将Java转换为的实例(包括地图内容) 我应该怎么做才能使此代码可编译? 问题答案: 从Collectors.toMap(…)javadoc: 例如:

  • 更正:正如你们所指出的,我使用的是Java7。现在,方法就在那里。但问题仍然适用: 如何从字符串中获取?

  • 问题内容: 谁能指导我如何使用PHP将XLS转换为CSV? 我有一个包含文档列表的Excel电子表格,我想使用PHP将其转换为CSV格式。 问题答案: 也许您可以开始使用PHP阅读XLS。 然后,使用主逻辑输出所需的内容(您的情况下为csv)。 祝好运,

  • 我有一个任务:返回一个公司地图,其中键是它的名称,值是存储为String的员工列表,由和组成,用空格分隔。这是我的解决方案和它的工作罚款: 所以我的问题是,如何转换

  • 我有一个复杂的要求,列表中记录有注释。我们有一个报告的功能,每个变化都应该被记录和报告。因此,根据我们的设计,即使单个字段已更新,我们也会创建一个全新的记录。 现在,我们希望将注释的历史记录(按时间戳反向排序)存储在数据库中。运行查询后,我得到了评论列表,但它包含重复的条目,因为其他一些字段被更改。它还包含空条目。 我编写了以下代码来删除重复和空条目。 这个逻辑工作正常,现在已经过测试了,但是我想

  • 问题内容: 我有一个要转换为CSV文件的JSON文件。如何使用Python执行此操作? 我试过了: 但是,它没有用。我正在使用Django,收到的错误是: 然后,我尝试了以下方法: 然后我得到错误: 样本json文件: 问题答案: 首先,你的JSON具有嵌套对象,因此通常无法直接将其转换为CSV。你需要将其更改为以下内容: 这是从中生成CSV的代码: 你将获得以下输出: