Carlos Delmar wrote:
> thanks Robert ... but it did not work out ...
>
>> The parts after "or" will never be called because each returns the
>> Enumerable.
>
> that was right, i replaced 'puts' after 'or' with 'warn' (which I had
> removed by mistake)
>
> Fnd a working script with some data here:
>
> http://rafb.net/paste/results/2yJH7J28.html
>
> BUT: I still would like to remove 'puts' and 'warn' in the
> process_transaction method and would much prefer to 'puts' a resulting
> string later in the transactions.each statement (or write that to a
> file).

Somehow I find your design a bit contrived: you store your meta data in
strings and then have to extract what you need.  It would be much cleaner
and simpler to directly store it, for example in arrays stored in hashes:


#!/usr/bin/ruby

# script should check if one of the keys in Ausgabekonten or
Einnahmekonten hash
# can be found in each line of the transactions array.
# If it does, it should print the matching key and value of the
Ausgabekonten hash.
# If it does not, it should print a warning.

Ausgabekonten = {
  /BIO COMPANY /  =>  ["1805", "Bio Company", "Lebensmittel"],
  /KAISERS /      =>  ["1805", "Bio Company", "Lebensmittel"],
  /VINOTRIA /     =>  ["1805", "Bio Company", "Lebensmittel"],
}

Einnahmekonten = {
  /CLIENT_ONE/    =>  ["8300", "Client 1", "Erlöse 7% Ust"],
  /CLIENT_TWO/    =>  ["8300", "Client 2", "Erlöse 7% Ust"],
}

transactions = [
  '"30.12.2005" "30.12.2005"  "VINOTRIA ITALIAN VINE STORE" "-20,00"
"EUR" "*"',
  '"30.12.2005" "30.12.2005"  "KAISERS FOOD"  "-140,00" "EUR" "*"',
  '"30.12.2005" "30.12.2005"  "SOMETHING NEW" "900,00"  "EUR" "*"',
  '"30.12.2005" "30.12.2005"  "CLIENT_ONE Job XY" "2.000,00"  "EUR" "*"',
  '"30.12.2005" "30.12.2005"  "I DONT REMEMBER" "-300,00" "EUR" "*"',
  '"30.12.2005" "30.12.2005"  "CLIENT_TWO Job XY" "1.500,00"  "EUR" "*"'
  ]

# method finds money snippet in string and converts it into a string
def find_money_string (string)

string.scan(/\"-?[0123456789]{0,3}.[0123456789]{0,3},[0-9][0-9]\"/).to_s.c
hop[1..-1]
end

# method changes string from german format (,.) to float (.)
def format_number(string)
  string.tr(".", ";").tr(",", ".").tr(";", "").to_f
end

# extracts the 4 digit number from a string
def extract_four_digit(string)
  string.to_s.scan(/[0-9][0-9][0-9][0-9]/)
end

# method extracts money of string
def get_money (string)
  x = find_money_string(string)
  format_number(x)
end

def parse(line)
  line.scan(/"([^"]*)"/).map {|m| m[0]}
end

# method checks what key matches with string and adds additional info to
each string
def process_transaction (line_of_file)
  date1, date2, text, amount, currency, rest = parse line_of_file
  amount = amount.tr('.,', '_.').to_f

  if amount < 0

   key, info =  Ausgabekonten.find { |key, konto| key =~ line_of_file }

   if info
     print line_of_file.chomp, " \"", info[1], "\" \"", info[0], "1200\n"
   else
     warn line_of_file.chomp + "        (no
       --      --      --"
   end

  else

   key, info =  Einnahmekonten.find { |key, konto| key =~ line_of_file }

   if info
        print line_of_file.chomp, " \"", info[1], "\" \"1200\" ", info[0],
"\n"
   else
        warn line_of_file.chomp + "     (no
       --      --      --"
   end
  end

end

# apply process_transaction to each line of the transactions array
transactions.each do |member|
  process_transaction(member)
end

HTH

    robert