【问题标题】:Lining up dates while reading CSV files读取 CSV 文件时排列日期
【发布时间】:2017-10-16 03:08:43
【问题描述】:

我有一系列 CSV 文件,我需要对其进行迭代并添加到日期对齐数据的聚合流中。具体来说,我有 CSV 文件,其中每一行都包含 M/d/yyyy 格式的日期(我通过 SimpleDateFormat 解析很好地读取了该日期),以及一系列包含其他信息(包括收入)的其他列。

在此之前,我一直在做一个非常浪费的过程,即遍历每个文件以获取唯一日期列表,然后启动嵌套 for 循环以遍历这些日期并从文件中读取,直到该日期的数据为在所有文件中找到。所有文件都按日期排序,但逻辑目前没有办法从之前停止的地方开始读取文件,这意味着每次有新日期时,它都不会从最后一个索引+1开始,它从 0 开始并再次读取所有内容。

    List<String> files = getFileNames();
    SortedSet<Date> dates = new TreeSet<>();
    for(String f : files){
        CSVReader readFile = new CSVReader(new FileReader("Output\\" + f));
        String[] nextLine = readFile.readNext();//Parses through header
        while((nextLine = readFile.readNext()) != null) {
            dates.add(new SimpleDateFormat("M/d/yyyy").parse(nextLine[0]));
        }
    }
    System.out.println("Earliest date: " + dates.first() + "\nLast Date: " + dates.last());

    List<Double> aggregateRevenue = new ArrayList<>();


    for(Date d : dates){
        System.out.println(d);
        double tempRevenue = 0.0;
        for(String f : files){
            CSVReader readFile = new CSVReader(new FileReader("Output\\" + f));
            String[] nextLine = readFile.readNext();
            Boolean searchContinues = true;
            while((nextLine = readFile.readNext()) != null && searchContinues){
                if(d.compareTo(new SimpleDateFormat("M/d/yyyy").parse(nextLine[0]))==0){
                    tempPnL += Double.parseDouble(nextLine[6]);
                    //System.out.println("  Hit date: " + d + "in file: " + f);
                    searchContinues=false;
                }
            }
        }
        aggregateRevenue.add(tempRevenue);
    }

我正在寻找一种更简单、更优雅的解决方案来聚合所有这些信息,但我不确定我应该使用什么。我正在寻找的内容概述如下:

  • 从一个 CSV 文件文件夹开始,其中行从最早日期到最晚日期排序,每个文件中的每一行都包含所述日期以及该日期的各种信息,包括每日返回值。
  • 我需要为任何一个或多个文件中表示的每个日期创建一个每日回报集合。并非所有日期都有信息,因此即使有最早和最晚的日期,文件中也可能不存在两者之间的日期。
  • 我想完成此操作,而不需要遍历每个文件中的每一行,直到找到日期,并且可以更好地访问它...

我一直在研究一些选项,但我希望能就执行此类任务真正最有效的方法提供一些意见。我可以想出一种方法来一次打开所有 CSV 文件并在每个文件上保留一个索引并根据需要通读它们,尽管我不喜欢巨大的 frankenstein 集合,例如 csvreaders 的数组列表或从内容中制作一个对象CSV 并保留这些数组。我可以以某种方式使用 HashMap 或其他一些 Key->Value 对来更好地阅读这些东西吗?有一个包含键->值对数组的某种对象,其中键是日期,值是该日期的回报。为每个 CSV 文件制作一个并能够更快地访问它?

这不一定是一些非常高效的程序,因为它只是我用来进行一些计算的工具,但如果运行不花一个小时(最后一个 67 分钟)会很好99% 的程序都在一遍遍地运行这些文件以获取相关信息。

【问题讨论】:

    标签: java csv hashmap


    【解决方案1】:

    Addressing " 所有文件都按日期排序,但逻辑目前无法从之前停止的位置开始读取文件,这意味着每次有新日期时,它都不会开始在最后一个 index+1 处,它从 0 开始并再次读取所有内容。”.

    基本上你需要一种方法来保存最后一行。你可以试试:

    • 在 while 循环外创建一个String[] lastLine。每次迭代将 lastLine 保存到 nextLine(在 while 循环内)。
    • 然后,当您跳出 while 循环时(意思是 nextLinenull),您将保存最后一行。你现在可以在它外面的 while 循环中做任何你在做的事情,用 lastLine 代替 nextLine

      if(d.compareTo(new SimpleDateFormat("M/d/yyyy").parse(lastLine[0]))==0){
          tempPnL += Double.parseDouble(lastLine[6]);
          //System.out.println("  Hit date: " + d + "in file: " + f);
          searchContinues=false;
      }
      

    【讨论】:

    • 只保存最后一行的内容,我需要在通过CSVReader读取的过程中保存位置。我想我只需 .readAll() 将我的 CSV 文件放入 List>,这是我想避免的 frankenstein 创建,然后为每个列表中的最后一个位置保存一组索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2022-12-05
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多