From: Geoff Date: 2007-04-27T01:00:06+09:00 Subject: Re: csv next and previous help James, It helps a lot! Still getting an error though. Here is the code I used and the error I got: require 'rubygems' require 'faster_csv' parsed = FCSV.parse('C:/ruby/work/FRIEDEXT01.LFP', 'r') changed = parsed.inject(Array.new) do |rows, row| if row[2] == "C" and (d_row = rows.reverse.find { |r| r[2] == "D" }) d_row[2] = "P" end rows << row end puts changed.map { |r| r.to_csv } c:/ruby/lib/ruby/gems/1.8/gems/fastercsv-1.2.0/lib/faster_csv.rb: 1320:in `merge': can't convert String into Hash (TypeError) from c:/ruby/lib/ruby/gems/1.8/gems/fastercsv-1.2.0/lib/ faster_csv.rb:1320:in `initialize' from c:/ruby/lib/ruby/gems/1.8/gems/fastercsv-1.2.0/lib/ faster_csv.rb:1184:in `new' from c:/ruby/lib/ruby/gems/1.8/gems/fastercsv-1.2.0/lib/ faster_csv.rb:1184:in `parse' from C:/ruby/work/lfp_parent.rb:4 Thanks, Geoff On Apr 25, 3:05 pm, James Edward Gray II wrote: > On Apr 25, 2007, at 3:45 PM, Geoff wrote: > > > I'm trying to figure out how to work with the sample data below such > > that I can take each time there is a C in the third column and update > > the previous D to a P. > > > An ideas? > > I've always got ideas. ;) > > >> require "rubygems" > => false > >> require "faster_csv" > => true > >> data = < IM,0000001,D,0,@FRIEDEXT01;IMAGES\00\00;0000001.TIF;2 > IM,0000002, ,0,@FRIEDEXT01;IMAGES\00\00;0000002.TIF;2 > IM,0000003,D,0,@FRIEDEXT01;IMAGES\00\00;0000003.TIF;2 > IM,0000004, ,0,@FRIEDEXT01;IMAGES\00\00;0000004.TIF;2 > IM,0000005,C,0,@FRIEDEXT01;IMAGES\00\00;0000005.TIF;2 > IM,0000006,D,0,@FRIEDEXT01;IMAGES\00\00;0000006.TIF;2 > END_DATA > => "IM,0000001,D,0,@FRIEDEXT01;IMAGES\000\000;0000001.TIF;2\nIM, > 0000002, ,0,@FRIEDEXT01;IMAGES\000\000;0000002.TIF;2\nIM,0000003,D, > 0,@FRIEDEXT01;IMAGES\000\000;0000003.TIF;2\nIM,0000004, , > 0,@FRIEDEXT01;IMAGES\000\000;0000004.TIF;2\nIM,0000005,C, > 0,@FRIEDEXT01;IMAGES\000\000;0000005.TIF;2\nIM,0000006,D, > 0,@FRIEDEXT01;IMAGES\000\000;0000006.TIF;2\n" > >> parsed = FCSV.parse(data) > => [["IM", "0000001", "D", "0", "@FRIEDEXT01;IMAGES\000 > \000;0000001.TIF;2"], ["IM", "0000002", " ", "0", "@FRIEDEXT01;IMAGES > \000\000;0000002.TIF;2"], ["IM", "0000003", "D", "0", > "@FRIEDEXT01;IMAGES\000\000;0000003.TIF;2"], ["IM", "0000004", " ", > "0", "@FRIEDEXT01;IMAGES\000\000;0000004.TIF;2"], ["IM", "0000005", > "C", "0", "@FRIEDEXT01;IMAGES\000\000;0000005.TIF;2"], ["IM", > "0000006", "D", "0", "@FRIEDEXT01;IMAGES\000\000;0000006.TIF;2"]] > >> changed = parsed.inject(Array.new) do |rows, row| > ?> if row[2] == "C" and (d_row = rows.reverse.find { |r| r[2] == > "D" }) > >> d_row[2] = "P" > >> end > >> rows << row > >> end > => [["IM", "0000001", "D", "0", "@FRIEDEXT01;IMAGES\000 > \000;0000001.TIF;2"], ["IM", "0000002", " ", "0", "@FRIEDEXT01;IMAGES > \000\000;0000002.TIF;2"], ["IM", "0000003", "P", "0", > "@FRIEDEXT01;IMAGES\000\000;0000003.TIF;2"], ["IM", "0000004", " ", > "0", "@FRIEDEXT01;IMAGES\000\000;0000004.TIF;2"], ["IM", "0000005", > "C", "0", "@FRIEDEXT01;IMAGES\000\000;0000005.TIF;2"], ["IM", > "0000006", "D", "0", "@FRIEDEXT01;IMAGES\000\000;0000006.TIF;2"]] > >> puts changed.map { |r| r.to_csv } > IM,0000001,D,0,@FRIEDEXT01;IMAGES;0000001.TIF;2 > IM,0000002, ,0,@FRIEDEXT01;IMAGES;0000002.TIF;2 > IM,0000003,P,0,@FRIEDEXT01;IMAGES;0000003.TIF;2 > IM,0000004, ,0,@FRIEDEXT01;IMAGES;0000004.TIF;2 > IM,0000005,C,0,@FRIEDEXT01;IMAGES;0000005.TIF;2 > IM,0000006,D,0,@FRIEDEXT01;IMAGES;0000006.TIF;2 > => nil > > Hope that helps. > > James Edward Gray II