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して、このようにファイルを1行ずつ解析できます

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 に答える