【发布时间】: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% 的程序都在一遍遍地运行这些文件以获取相关信息。
【问题讨论】: