0

帮助我集思广益,我将如何解决这个问题。

我有一个包含相应数据的日期文件,格式如下:

Date,data,data,data,data,data
Date,data,data,data,data,data

这是一个普通的 csv 文件,只使用逗号。

我需要能够选择开始日期。然后从所选日期开始获取接下来 20 天的数据。

日期格式:2007.05.21 (y,m,d)

所以我认为最好搜索日期。要么首先将整个文件加载到内存中,要么逐行读取。该文件只有 1 兆字节,但我可能也想使用 100 兆字节的文件来执行此操作。这还小吗?

我也想做很多次。我想我可能想在程序的整个运行过程中将文件保存在内存中。所以我可以反复访问它。

找到日期后。我需要能够获得第 2 列第 1 天,第 4 列第 4 天。等等。但是,每天总是有相同数量的列。所以我想如果这被加载到某种数组中,我总是可以知道第二天和第二天开始的数组编号。

任何帮助将不胜感激。此外,提供的任何代码示例都会有帮助。这不是家庭作业问题或类似的问题,我对编程真的很陌生。

4

2 回答 2

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
于 2012-08-13T16:06:14.043 回答
0

当您的数据被排序时,二分搜索就是您想要使用的。

简而言之,您在 CSV 中间查找一个元素,将其日期与您要查找的日期进行比较,然后在文件的匹配部分中继续递归(有关详细信息,请参阅 Wikipedia 链接)。

二分查找的运行时复杂度为 O(log n),这意味着对包含 1,000,000 行的文件(合理估计为 100 MB)的读取操作次数永远不会(在正常情况下,即不同长度的行是相等的)分布式)超过 20 个。

因此,没有必要将文件保存在内存中,恰恰相反。操作系统的磁盘缓存将为您完成加速连续操作的任务,而不会遇到内存不足的情况。

要读取和处理一行,首先需要找到它的第一个字符,它可以是换行符 (\n) 之后的第一个字母,也可以是文件的开头。读取多行也可以实现类似的。要解析一行,我建议您在分隔字符和/或日期的点处拆分行。当然,这仅适用于 CSV 来自可靠来源并且从不更改其布局的情况。

于 2012-08-13T16:15:09.950 回答