[#42243] コミュニティと宗教の分離について — Beyond <beyond@...>

14 messages 2006/05/21

[#42267] メニューのループについて — リックス <rubyer4649@...>

りっくすです

21 messages 2006/05/27

[#42301] Re: メニューのループについて — "conundrum /" <conundrum@...>

conundrumです。

11 messages 2006/05/28

[ruby-list:42261] Re: File objectがいつのまにか nilに、

From: "Hiroyuki Iwatsuki" <don@...>
Date: 2006-05-23 11:33:41 UTC
List: ruby-list #42261
岩月と申します。

かなり適当ですが、こんな感じではどうでしょうか。
先頭部分が一致しない行に達するまで行を溜め込んでから
ファイルに保存しています。

M = %w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)

def save(m, d, s)
  fn = "%02d%02d.txt" % [m, d]
  File.open(fn, "a+") do |o|
    o.write(s)
  end
end

# 入力ファイル名リスト
files = ["dhcplog1.txt", "dhcplog2.txt", "dhcplog3.txt"]

files.each do |file|
  File.open(file) do |i|
    k, m, d, s = nil, nil, nil, ""
    while not i.eof?
      line = i.readline
      if /^([A-Za-z]+)\s+(\d+)/ =~ line
	if $& == k
	  s << line
	else
	  save(m, d, s) unless k.nil?
	  k, m, d, s = $&, M.index($1) + 1, $2.to_i, line
	end
      end
    end
    save(m, d, s) unless s.nil?
  end
end

入力データが文字列ならもっと短くて済むんですが。

str.scan(/^(([A-Za-z]+)\s+(\d+))[^\n]+\n(\1[^\n]+\n)*/) do
  filename = "%02d%02d.txt" % [M.index($2) + 1, $3.to_i]
  File.open(filename, "w") do |f|
    f.write($&)
  end
end

-- 
IWATSUKI Hiroyuki <URL:mailto:don@na.rim.or.jp>

In This Thread

Prev Next