Download or view tns.frink in plain text format
// Minimal data structure to hold information about a person.
class AddressData
{
var name
var address
var fullLine
// Array of dates of postings.
var postings = new array
addPosting[date] := postings.push[date]
numPostings[] := length[postings]
}
files = ["file:///C:/Documents and Settings/eliasen/Application Data/Mozilla/Profiles/eliasen@mindspring-1.com/tob3br3e.slt/Mail/mail.mindspring.com/triplenine"]
// Key is email address (lowercased)
// Value is an AddressData object.
addresses = new dict[]
// Array containing hour in day
hours = new array
for hour=0 to 23
hours@hour = 0
// Array containing day in week
days = new array
for day=0 to 6
days@day = 0
dayshours = new array
for day=0 to 6
{
dayshours@day = new array
for hour = 0 to 23
dayshours@day@hour = 0
}
daynames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
// Mozilla date format
### MMM dd HH:mm:ss yyyy ###
for file files
{
headermode = false
for line = lines[file]
{
if (! headermode)
{
// Look for start of a new message.
if [dateStr] = line =~ %r/^From - \w{3} (\w{3} \d{2} \d{2}:\d{2}:\d{2} \d{4})/
{
headermode = true
date = parseDate[dateStr]
// println[date]
next
}
}
// Inside a header
if (headermode)
{
if (line =~ %r/^\s*$/) // Blank line means end of headers
{
headermode = false
next
}
// Look for sender's name
if [fullAddress] = line =~ %r/^From:\s+(.*)/
{
if [name, address] = fullAddress =~ %r/(.*)\s*<(.*)>/
{
name =~ %s/"(.*)"/$1/ // Remove quotes
//
} else
if [address] = fullAddress =~ %r/^(\S+)\s*$/
name = ""
else
println["UNMATCHED: $fullAddress"]
address = lc[address]
if (addresses@address != undef)
{
// Address already exists
addrObj = addresses@address
addrObj.addPosting[date]
} else
{
// New address
// println["$name\t$address"]
addrObj = new AddressData[]
addrObj.address = address
addrObj.name = name
addrObj.fullLine = fullAddress
addrObj.addPosting[date]
addresses@address = addrObj
}
hourOfDay = (date - #2000-01-02 00:00#) mod day div hour
dayOfWeek = (date - #2000-01-02 00:00#) mod week div day
hours@hourOfDay = hours@hourOfDay + 1
days@dayOfWeek = days@dayOfWeek + 1
dayshours@dayOfWeek@hourOfDay = dayshours@dayOfWeek@hourOfDay + 1
}
}
}
}
// Sort the array
for [key, val] sort[addresses, { |a,b| (a@1).numPostings[] <=> (b@1).numPostings[]} ]
{
println[key + "\t" + val.name + "\t" + val.numPostings[]]
}
println["\nHours of day:"]
// Array containing hour in day
for hour = 0 to 23
println[hour + "\t" + hours@hour]
println["\nDays of week:"]
// Array containing hour in day
for day = 0 to 6
println[daynames@day + "\t" + days@day]
println["\nDays and hours:"]
for day = 0 to 6
print["\t" + daynames@day]
println[]
for hour = 0 to 23
{
print["$hour\t"]
for day = 0 to 6
print[dayshours@day@hour + "\t"]
println[]
}
Download or view tns.frink in plain text format
This is a program written in the programming language Frink.
For more information, view the Frink
Documentation or see More Sample Frink Programs.
Alan Eliasen was born 20167 days, 1 hours, 50 minutes ago.