#TODO: Create 'installer' for this.
require 'rubygems'
require 'dbi'
require 'activerecord'
class Report
attr_reader :last, :first, :ssn, :date, :proc, :refphys,
:filename, :modality, :age, :absolute_age
def initialize filename
@last, @first, @ssn, @date, @proc, @refphys = "", "", "", "", "", []
@filename = filename
@modality = ""
@absolute_age = 0 # Age in seconds, for ease of comparison.
@old_threshold = 18 # Number of hours, chosen by John.
@old = false # If the report is older than old_threshold, make it true.
@age = get_age
report = `c:/antiword/antiword.exe -m cp850.txt "#{@filename}"`.split("\n")
report.delete_if { |a| a == ""}
report.each do |line|
line = line.upcase.split(":")
case line[0]
when "PATIENT NAME":
@last, @first = line[1][0..-4].strip.split(",")
@ssn = (line[2].strip rescue "000-00-0000")
when "DATE OF EXAM":
@date = line[1].strip
fix_date
when "RE":
@proc = (line[1].strip rescue "procedure unavailable")
end
if line[0][0..3] == "DEAR":
line = line[0][4..-1]
line = line[0..-2] if line[-1..-1] == ","
line.split(",").each do |doc|
if doc.include? " AND "
@refphys.concat doc.strip.split(" AND ")
else
@refphys.concat [doc.strip]
end
end
end
end
determine_modality
end
def old?
@old
end
private
def get_age
@absolute_age = Time.now - File.ctime(@filename)
age = (@absolute_age / 60).round
# The first calculation returns seconds. Divide by 60 to get minutes.
return "#{age}min" if age < 60
age = (age / 60).round # Divide by 60 to get hours.
@old = true if age > @old_threshold
return "#{age}h" if age < 24
return "#{(age / 24).round}d #{age % 24}h" # Divide by 24 to get days
end
def fix_date
a = @date.split('/')
@date = "#{a[2]}-#{a[0]}-#{a[1]}".to_date
end
def same_modality? list
check = list[0][0]
same = true
list.each do |i|
same = false if check != i[0]
end
return same
end
def determine_modality
if @proc.include? "X RAY" or @proc.include? "X-RAY"
@modality = "CR"
return
end
sqldate = @date.to_s
last = @last.gsub("'", "%").gsub(" ", "%").gsub("-","%")
first = @first.split(' ')[0].gsub("'", "%").gsub("-", "%")
query = %Q{
SELECT EXP.modality_code FROM examination EX
INNER JOIN patient P on P.pat_ckey = EX.pat_ckey
INNER JOIN exam_procedure EXP on EXP.procedure_ckey = EX.procedure_ckey
WHERE P.pat_name like '#{last}%#{first}%' AND
CONVERT(SMALLDATETIME, CONVERT(VARCHAR(10), EX.study_dttm, 101) ) = '#{sqldate}'
}
begin
dbh = DBI.connect( 'DBI:ODBC:PACS', 'sa', '')
data = dbh.select_all query
rescue DBI::DatabaseError => e
puts "An error occurred"
puts "Error code: #{e.err}"
puts "Error message: #{e.errstr}"
ensure
# disconnect from server
dbh.disconnect if dbh
end
if data[0].nil? or data[0].empty?
@modality = "NA"
elsif data.size > 1
if same_modality? data
@modality = data[0][0]
else
@modality = "NA"
end
else
@modality = data[0][0]
end
end
end
T0 = Time.now
require 'rubygems'
require 'activerecord'
require 'report'
reports = []
#file_name = 'my_word.doc'
Folders = ['full_path_of_folder1',
'full_path_of_folder2'
]
Folders.each do |folder|
Dir.chdir folder
Dir.glob('*').each do |file|
next if File.directory? file or file[0..0] == "~"
reports << (Report.new file)
puts "#{folder + file}"
end
end
puts "Total files processed: #{reports.size}."
puts "#{Time.now - T0} seconds."