1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
| filename = "sample records.txt"
file = File.open(filename)
data = []
record = {}
class MyParse
Tokens = [
### change the regular expressions accordingly ###
### sale date, sale time, sale address,
[/^Sale:\s*(\d+\/\d+\/\d+)\s+(\S+\s+\w\w)\s+(.+?)\s*$/,
lambda { |m| m.to_a &&
{"sale date"=>m[1], "sale time"=>m[2], "sale address"=>m[3] } }],
### seller name, seller time, seller address
[/^Seller:\s*(\d+\/\d+\/\d+)\s+(\S+\s+\w\w)\s+(.+?)\s*$/,
lambda { |m| m.to_a &&
{"seller date"=>m[1], "seller time"=>m[2], "seller address"=>m[3] } }],
### Trustor: trustor
[/^Trustor:\s+(.+?)\s*$/,
lambda { |m| m.to_a && {"trustor"=>m[1] } }],
]
def self.read(text)
parse(text)
end
protected
def self.parse(text)
text.each do |line|
Tokens.each do |token|
if m = token.first.match(line)
return token.last.call(m)
end
end
end
nil
end
end
begin
while line = file.readline
if line.match(/^\s*$/)
record = {}
next
end
line.sub!("\r", "")
if record = MyParse.read(line)
data.push(record)
end
end
rescue EOFError => e
puts "'#{filename}': #{e}"
ensure
file.close
end
puts data.inspect
exit(0) |