require 'rockit/rockit' def dose_from_measure(measure) values = measure ? measure.childrens[0,2].collect{ |c| c.value } : [1,nil] #Dose.new(*values) end def dose_from_scale(scale) values = scale ? scale.childrens[1,2].collect{ |c| c.value } : [1,nil] #Dose.new(*values) end def dose_from_multi(multi) unless(multi.nil?) #multi.childrens.inject(UNIT) { |inj, node| multi.childrens.inject(1) { |inj, node| unit = (node[1].value if node[1]) #dose = Dose.new(node[0].value, unit) dose = node[0].value.to_f inj *= dose } else #UNIT 1 end end def parse_size(size) unit_pattern = '(([kmµucMG]?([glLJm]|mol|Bq)\b)(\/([mµu]?[glL])\b)?)|((Mio\s)?U\.?I\.?)|(%( [mV]\/[mV])?)|(I\.E\.)|(Fl\.)' numeric_pattern = '\d+(\'\d+)*([.,]\d+)?' iso_pattern = "[[:alpha:]()\-]+" @parser = Parse.generate_parser <<-EOG Grammar OddbSize Tokens DESCRIPTION = /(?!#{unit_pattern}\s)#{iso_pattern}(\s+#{iso_pattern})*/u NUMERIC = /#{numeric_pattern}/u SPACE = /\s+/u [:Skip] UNIT = /#{unit_pattern}/u Productions Size -> Multiple* Addition? Count? Measure? Scale? Dose? DESCRIPTION? Count -> 'je'? NUMERIC Multiple -> NUMERIC UNIT? /[xXà]|Set/u Measure -> NUMERIC UNIT UNIT? Addition -> NUMERIC UNIT? '+' Scale -> '/' NUMERIC? UNIT Dose -> '(' NUMERIC UNIT ')' EOG multi, addition, count, measure, scale, dose, comform = nil begin multi, addition, count, measure, scale, dose, comform = @parser.parse(size).flatten count = (count ? count[1].value.to_i : 1) rescue ParseException, AmbigousParseException => e count = size.to_i end [ (addition ? addition.first.value.to_i : 0), dose_from_multi(multi), count, dose_from_measure(measure), dose_from_scale(scale), (comform.value if comform), ] =begin #count = (count ? count[1].value.to_i : 1) count = count ? count.childrens : nil multi = multi ? multi.childrens : [] # multi = mult.map{|m| m.childrens} unless multi.empty? #multi = multi[0].childrens unless multi.empty? multi = multi.map{|m| m.childrens} unless multi.empty? scale = scale ? scale.childrens : nil measure = measure ? measure.childrens : nil addition = addition ? addition.childrens : nil rescue ParseException, AmbigousParseException => e count = size.to_i end [multi, addition, count, measure, scale, dose, comform] =end # [multi, addition, count, measure, scale, dose, comform] end str_list = [ # '9 Suppositorien', # '10 ', # '200 ml', # '10x200 ml', # '5 Tüchlein', '5 Set', # '10 x 5 Mio I.E.', # '200 (4 x 50) Tablette(n)', # '10 x 5 Mio I.E.', # '2 x 5 x 75 ml', # '1x 5000mg/100ml Durchstechflasche(n)', ] File.readlines('size.dat').each do |str| #str_list.each do |str| print "%-25s: " % str.chomp.inspect p parse_size(str.chomp) end