From: b1_ __ Date: 2012-08-03T17:39:15+09:00 Subject: Having difficulty processing text files - some techniques? I am trying to extract information from a po-ker hand history text file as an exercise in learning RegExp and ruby file manipulation classes IO and File. The way the hand history text file is set out is like so: Hand No. xxxx - Date xxxx Time xxxx Game type: xxxx Blinds level: xxxx Table type: xxx Player 1: xxxx (chip count) Player 2: xxxx (chip count) Player 3: xxxx (chip count) Player 4: xxxx (chip count) Hole Cards Phase Player 1 calls Player 2 raise Player 3 folds Flop Phase Player 1 raises Player 2 calls Turn Phase etc etc River Phase etc etc Player 2 wins In my testing I have extracted successfully the very simple statistic of VP$IP, which is the percentage of times a player Voluntarily Puts $ In Pot pre-flop. So this is: Number of time called or raise pre-flop / Number of hands at the table My code (I used what I think is a Finite State Machine?): File.open("test_read.txt") do |f| count = 0 state = nil while (line = f.gets) case (state) when nil # Look for the words "Hole Cards" and if found turn on text processing if (line.match(/Hole Cards/)) state = :parsing end when :parsing # Look for word "Flop" or "wins" and if found stop processing text if (line.match(/Flop/)) || (line.match(/wins/)) state = nil else if (line.match(/#{name} calls/)) || (line.match(/#{name} raises/)) then count += 1 end end end end return count end This code processes text only when inside the Hole Card phase (pre-flop phase) between lines with words "Hole Cards" (start text processing) and "Flop" or "wins" (stop processing text). It increments a counter if it finds the words "calls" and "raises" next to a player's name. This code ran through the whole file, maybe over hundreds of hands, and extracted the data. The problem I am having is that I need to have the extracted data associate with hand data. Hand data might be the date of the hand was played, the number of players in the hand, the blind level. This means I need isolate each hand, extract the hand data and put it in a hash for example, then extract stats like VP$IP for each player (a hand-by-hand approach rather than a file-wide approach). So the output might go into a text file specific to each player that would look like: Player 1 VP$IP 2P 3P 4P All HandsAtTables 2012-07-23 3 201 21 225 534 2012-07-24 45 10 3 58 1001 2012-07-25 5 5 5 15 420 Can I do this without storing data in arrays or objects? I've been thinking I can use another Finite State Machine, only look for the words "Hand" (start of hand) and "wins" (end of hand), the problem is I need some of the data on the line that has the word "Hand" on it, something I can't do with my code above. I also need to switch between hands when there are no lines between the word "wins" and the next line which will have the word "Hands" on it indicating the start of the next hand. I have been looking at Gregory Brown's Ruby Best Practices chapter 4 (http://majesticseacreature.com/rbp-book/pdfs/ch04.pdf) on text processing methods but cannot get my head around his code. Thx if you can help. -- Posted via http://www.ruby-forum.com/.