# Csv next and previous help

**URL:** <https://www.ruby-forum.com/t/csv-next-and-previous-help/92945>\
**Category:** Ruby\
**Created:** [April 25, 2007, 10:45pm UTC](https://www.ruby-forum.com/t/csv-next-and-previous-help/92945 "2007-04-25T22:45:30Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![geoff](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/a3d4f5/32.png) [@geoff](https://www.ruby-forum.com/u/geoff)\
**Post date:** [April 25, 2007, 10:45pm UTC](https://www.ruby-forum.com/t/csv-next-and-previous-help/92945/1 "2007-04-25T22:45:30Z")

</div>

Hey there,

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?

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

This should end up like this:

IM,0000001,D,0,@FRIEDEXT01;IMAGES\00\00;0000001.TIF;2  
IM,0000002, ,0,@FRIEDEXT01;IMAGES\00\00;0000002.TIF;2  
IM,0000003,P,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

Thank you,

Geoff

---

<div class="post-metadata">

**Author:** ![geoff](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/a3d4f5/32.png) [@geoff](https://www.ruby-forum.com/u/geoff)\
**Post date:** [April 26, 2007, 12:07am UTC](https://www.ruby-forum.com/t/csv-next-and-previous-help/92945/2 "2007-04-26T00:07:36Z")

</div>

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 = \<\<END\_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 G. II

---

<div class="post-metadata">

**Author:** ![geoff](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/a3d4f5/32.png) [@geoff](https://www.ruby-forum.com/u/geoff)\
**Post date:** [April 26, 2007, 12:09am UTC](https://www.ruby-forum.com/t/csv-next-and-previous-help/92945/3 "2007-04-26T00:09:36Z")

</div>

A Naive implementation below,

string = %q{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}

puts “%%%%%%%%%% BEFOR PARSING %%%%%%%%%%%%%”  
puts string

last\_d\_line = nil  
line\_array = string.split("\n")  
line\_array.each\_with\_index do |line, i|  
if line.split(’,’)[2] == “D”  
last\_d\_line = i  
end  
if line.split(’,’)[2] == “C”  
arr = line\_array[last\_d\_line].split(’,’)  
arr[2] = “P”  
line\_array[last\_d\_line] = arr.join(’,’)  
end  
end

puts “%%%%%%%%%%%% PARSED %%%%%%%%%%%%%%”  
puts line\_array

Cheers,  
Ganesh G.

---

<div class="post-metadata">

**Author:** ![geoff](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/a3d4f5/32.png) [@geoff](https://www.ruby-forum.com/u/geoff)\
**Post date:** [April 26, 2007, 6:39pm UTC](https://www.ruby-forum.com/t/csv-next-and-previous-help/92945/4 "2007-04-26T18:39:08Z")

</div>

On Apr 26, 2007, at 11:00 AM, Geoff wrote:

> It helps a lot!

Good.

> Still getting an error though.

I bet we can fix that.

> 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’)

Let’s try changing the above line to:

parsed = FCSV.read(‘C:/ruby/work/FRIEDEXT01.LFP’)

> 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 }

Hope that helps.

James Edward G. II

---

<div class="post-metadata">

**Author:** ![geoff](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/a3d4f5/32.png) [@geoff](https://www.ruby-forum.com/u/geoff)\
**Post date:** [April 26, 2007, 9:50pm UTC](https://www.ruby-forum.com/t/csv-next-and-previous-help/92945/5 "2007-04-26T21:50:28Z")

</div>

Excellent, thanks!

Now if only I understood all this better. 🙂

Geoff

On Apr 26, 9:37 am, James Edward G. II [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![geoff](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/a3d4f5/32.png) [@geoff](https://www.ruby-forum.com/u/geoff)\
**Post date:** [April 26, 2007, 6:01pm UTC](https://www.ruby-forum.com/t/csv-next-and-previous-help/92945/6 "2007-04-26T18:01:04Z")

</div>

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 G. II [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![geoff](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/a3d4f5/32.png) [@geoff](https://www.ruby-forum.com/u/geoff)\
**Post date:** [April 26, 2007, 10:00pm UTC](https://www.ruby-forum.com/t/csv-next-and-previous-help/92945/7 "2007-04-26T22:00:28Z")

</div>

On Apr 26, 2007, at 2:50 PM, Geoff wrote:

> Now if only I understood all this better. 🙂

Feel free to ask questions. I’ll try to explain.

James Edward G. II

---

<div class="post-metadata">

**Author:** ![geoff](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/a3d4f5/32.png) [@geoff](https://www.ruby-forum.com/u/geoff)\
**Post date:** [April 27, 2007, 9:16am UTC](https://www.ruby-forum.com/t/csv-next-and-previous-help/92945/8 "2007-04-27T09:16:17Z")

</div>

Geoff wrote:

> IM,0000003,D,0,@FRIEDEXT01;IMAGES\00\00;0000003.TIF;2  
> IM,0000005,C,0,@FRIEDEXT01;IMAGES\00\00;0000005.TIF;2  
> IM,0000006,D,0,@FRIEDEXT01;IMAGES\00\00;0000006.TIF;2
> 
> Thank you,
> 
> Geoff

data = IO.readlines(“junk”).map{|line| line.split(",")}.transpose  
flag = nil  
(data[2].size - 1).downto(0){|i|  
case data[2][i]  
when ‘C’  
flag = true  
when ‘D’  
data[2][i] = ‘P’ if flag  
flag = nil  
end  
}  
puts data.transpose.map{|a| a.join(",")}

— input —  
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

— output —  
IM,0000001,D,0,@FRIEDEXT01;IMAGES\00\00;0000001.TIF;2  
IM,0000002, ,0,@FRIEDEXT01;IMAGES\00\00;0000002.TIF;2  
IM,0000003,P,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
