在读取CSV文件时排列日期

时间:2017-05-16 21:04:14

标签: java csv hashmap

我有一系列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的arraylist或制作一个对象CSV的内容并保留其中的数组。我可以以某种方式使用HashMap或其他一些Key-&gt; Value对来更好地阅读这些内容吗?有一个包含Key-&gt; Value对数组的某种对象,其中键是日期,值是该日期的返回值。为每个CSV文件制作其中一个,并能够更快地访问它?

这不一定是一个非常有效的程序,因为它只是我用来做一些计算的工具,但是对于跑步来说它不是很好一小时(最后一个67分钟),其中99%的程序反复运行这些文件以获取相关信息。

1 个答案:

答案 0 :(得分:0)

解决&#34;所有文件都是按日期排序的,但逻辑目前没有办法开始读取之前停止的文件,这意味着每次有新日期,它都不会从最后一个索引+ 1,它从0开始并再次读取所有内容。&#34;

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

  • 在while循环外创建String[] lastLine。每次迭代都将lastLine保存到nextLine(在while循环内)。
  • 然后当您退出while循环(意味着nextLinenull)时,您将保留最后一行。您现在可以在其外的while循环中执行任何操作,将nextLine替换为lastLine

    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;
    }