加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

使用Java 8 Stream解析.csv文件

发布时间:2020-12-15 04:49:39 所属栏目:Java 来源:网络整理
导读:我有一个.csv文件,其中包含500多家公司的数据.文件中的每一行都指特定的公司数据集.我需要解析这个文件并从每个文件中推断数据以调用4个不同的Web服务. .csv文件的第一行包含列名.我正在尝试编写一个采用字符串参数的方法,这与.csv文件中的列标题有关. 基于
我有一个.csv文件,其中包含500多家公司的数据.文件中的每一行都指特定的公司数据集.我需要解析这个文件并从每个文件中推断数据以调用4个不同的Web服务.

.csv文件的第一行包含列名.我正在尝试编写一个采用字符串参数的方法,这与.csv文件中的列标题有关.

基于此参数,我希望该方法使用Java 8的Stream功能解析文件,并返回从每个行/公司的列标题中获取的数据列表.

我觉得我让它变得比它需要的更复杂但却想不出更有效的方法来实现我的目标.

任何想法或想法将不胜感激.

通过stackoverflow搜索我发现以下帖子类似但不完全相同.
Parsing a CSV file for a unique row using the new Java 8 Streams API

public static List<String> getData(String titleToSearchFor) throws IOException{
    Path path = Paths.get("arbitoryPath");
    int titleIndex;
    String retrievedData = null;
    List<String> listOfData = null;

    if(Files.exists(path)){ 
        try(Stream<String> lines = Files.lines(path)){
            List<String> columns = lines
                    .findFirst()
                    .map((line) -> Arrays.asList(line.split(",")))
                    .get();

            titleIndex = columns.indexOf(titleToSearchFor);

            List<List<String>> values = lines
                    .skip(1)
                    .map(line -> Arrays.asList(line.split(",")))
                    .filter(list -> list.get(titleIndex) != null)
                    .collect(Collectors.toList());

            String[] line = (String[]) values.stream().flatMap(l -> l.stream()).collect(Collectors.collectingAndThen(
                    Collectors.toList(),list -> list.toArray()));
            String value = line[titleIndex];
            if(value != null && value.trim().length() > 0){
                retrievedData = value;
            }
            listOfData.add(retrievedData);
        }
    }
    return listOfTitles;
}

谢谢

解决方法

您不应该重新发明轮子并使用常见的csv解析器库.例如,您可以使用 Apache Commons CSV.

它将为您处理很多想法,并且更具可读性.还有OpenCSV,它更强大,并且带有基于注释的数据类映射.

try (Reader reader = Files.newBufferedReader(Paths.get("file.csv"));
            CSVParser csvParser = new CSVParser(reader,CSVFormat.DEFAULT
                    .withFirstRecordAsHeader()        
        ) {
            for (CSVRecord csvRecord : csvParser) {
                // Access
                String name = csvRecord.get("MyColumn");
                // (..)
          }

编辑:
无论如何,如果你真的想自己做,请看看this的例子.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读