帮助我集体讨论如何解决这个问题。
我有一个包含相应数据的日期文件,格式如下:
Date,data,data,data,data,data
Date,data,data,data,data,data
这是一个普通的csv文件,只使用了逗号。
我需要能够选择开始日期。然后从所选日期开始获取接下来20天的数据。
日期格式: 2007.05.21(y,m,d)
所以我认为最好搜索日期。将整个文件首先加载到内存中或逐行读取。该文件只有1兆字节,但我可能也希望使用100兆字节的文件。那还小吗?
我也想多次这样做。我想我可能希望将文件保存在整个程序运行的内存中。所以我可以反复访问它。
找到日期后。我需要能够获得第2天第2列,第4天第4天。但是,每天的列数始终相同。所以我想如果将它加载到某种数组中,我总能知道下一天和第二天的数组编号。
非常感谢任何帮助。此外,提供的任何代码示例都会有所帮助这不是一个家庭作业问题或类似的东西,我对编程很陌生。
答案 0 :(得分:1)
您可以使用csv
库来逐行解析文件
require 'csv'
date_to_search = Date(2009, 10, 10)
CSV.read('yourfilename.txt', :col_sep => ',') do |row|
# row will be an array of strings which you can parse
cur_date = Date.parse(row[0])
if cur_date == date_to_search
# you are set to read next 19 lines
# you can keep a counter and increment it after parsing each line (row here)
end
# compare and check if you need this line (and next 19)
# other calculations
end
答案 1 :(得分:0)
在对数据进行排序时,您需要使用Binary Search。
简单地说,您在CSV中间附近查找元素,将其日期与您要查找的日期进行比较,并在文件的匹配部分中递归递送(有关详细信息,请参阅Wikipedia链接)。 / p>
二进制搜索的运行时复杂度为O(log n),这意味着对包含1,000,000行的文件(100 MB的合理估计)的读取操作数永远不会(在正常情况下,即不同的行)长度均匀分布)超过20.
因此,没有必要将文件保留在内存中,恰恰相反。操作系统的磁盘缓存将完成为您加速连续操作的任务,而不会导致内存不足。
要读取和处理一行,首先需要找到它的第一个字符,它是换行符后面的第一个字母(\ n)或文件的开头。读取多行可以实现类似。 要解析一条线,我建议你在分隔字符和/或日期点分割线。当然,这只适用于CSV来自可靠来源并且永远不会更改其布局的情况。