csv nil check and update

G

Geoff

Greetings!

What I have is a .csv file (comma separated and quote delimited):

"BegDoc","EndDoc","New"
"Doc1BegDoc","Doc1EndDoc","Test1"
"Doc2BegDoc","Doc2EndDoc",""
"Doc3BegDoc","Doc3EndDoc","Test2"
"Doc4BegDoc","Doc4EndDoc",""
"Doc5BegDoc","Doc5EndDoc","New"

I can read the lines of the file with this:

require 'CSV'
csvData = CSV.readlines("C:\\temp\\geoff\\filldown\\filldown.txt")

Now what I want to do is check for blanks and when I find one I want to
take the info from the entry directly above and fill down the column
until the next blank. Using the above example, I want the following
output:

"BegDoc","EndDoc","New"
"Doc1BegDoc","Doc1EndDoc","Test1"
"Doc2BegDoc","Doc2EndDoc","Test1"
"Doc3BegDoc","Doc3EndDoc","Test2"
"Doc4BegDoc","Doc4EndDoc","Test2"
"Doc5BegDoc","Doc5EndDoc","New"

Any help is greatly appreciated!

Thanks,

Geoff
 
J

James Edward Gray II

Now what I want to do is check for blanks and when I find one I
want to
take the info from the entry directly above and fill down the column
until the next blank. Using the above example, I want the following
output:

"BegDoc","EndDoc","New"
"Doc1BegDoc","Doc1EndDoc","Test1"
"Doc2BegDoc","Doc2EndDoc","Test1"
"Doc3BegDoc","Doc3EndDoc","Test2"
"Doc4BegDoc","Doc4EndDoc","Test2"
"Doc5BegDoc","Doc5EndDoc","New"

Any help is greatly appreciated!

See if this gives you some ideas:

Neo:~/Desktop$ ls
csv_filldown.rb data.csv
Neo:~/Desktop$ cat data.csv
"BegDoc","EndDoc","New"
"Doc1BegDoc","Doc1EndDoc","Test1"
"Doc2BegDoc","Doc2EndDoc",""
"Doc3BegDoc","Doc3EndDoc","Test2"
"Doc4BegDoc","Doc4EndDoc",""
"Doc5BegDoc","Doc5EndDoc","New"
Neo:~/Desktop$ cat csv_filldown.rb
#!/usr/local/bin/ruby -w

require "csv"

last = ""

CSV.foreach(ARGV.shift) do |row|
if row[-1].empty?
row[-1] = last
else
last = row[-1]
end

p row
end

__END__
Neo:~/Desktop$ ruby csv_filldown.rb data.csv
["BegDoc", "EndDoc", "New"]
["Doc1BegDoc", "Doc1EndDoc", "Test1"]
["Doc2BegDoc", "Doc2EndDoc", "Test1"]
["Doc3BegDoc", "Doc3EndDoc", "Test2"]
["Doc4BegDoc", "Doc4EndDoc", "Test2"]
["Doc5BegDoc", "Doc5EndDoc", "New"]

James Edward Gray II
 
G

Geoff

That does give me some ideas... thanks!

Now:

"Initialize" cannot convert nil to a string.

Any ideas on that one?
 
C

ChrisH

You have an answer, but since I spent some time on it, here's mine! 9^)

require 'csv'
csvData = CSV.readlines("d:\\ruby\\dev\\filldown-csv\\filldown.txt")
puts 'Before:'
csvData.each {|l| p l}

1.upto(csvData.size - 1){ |i|
0.upto(csvData.size - 1){|j|
csvData[j] ||= csvData[i-1][j]
}
}
puts 'After:'
csvData.each {|l| p l}


For some reason my CSV wouldn't read the data when it has quotes around
the values...

cheers
Chris
 
G

Geoff

Ok, obiously I'm doing something wrong again. I am new to both
programming and to Ruby, so please excuse the low brow questions!

I've now got this because I really want to take the result and output
to a new file, but it does not work:

require 'CSV'

last = ""
newFile = File.open("C:\\temp\\geoff\\filldown\\filldownNew.txt", "w+")
CSV.foreach("C:\\temp\\geoff\\filldown\\filldown.txt") do |row|
if row[-1].empty?
row[-1] = last
else
last = row[-1]
end
newFile << (p row)
end

Ideas?

Thanks!

Geoff
 
G

Geoff

Thanks, I appreciate it. For some reason the output is the same as the
input when I try this though. Not sure why it does not work.
 
J

James Edward Gray II

Ok, obiously I'm doing something wrong again. I am new to both
programming and to Ruby, so please excuse the low brow questions!

I've now got this because I really want to take the result and output
to a new file, but it does not work:

require 'CSV'

last = ""
newFile = File.open("C:\\temp\\geoff\\filldown\\filldownNew.txt", "w
+")

Change the above to:

newFile = CSV.open(...)
CSV.foreach("C:\\temp\\geoff\\filldown\\filldown.txt") do |row|
if row[-1].empty?
row[-1] = last
else
last = row[-1]
end
newFile << (p row)

And this to:

newFile << row
end

Ideas?

Also, just FYI, the Ruby naming convention for variables is
like_this, not likeThis.

Hope that helps.

James Edward Gray II
 
C

ChrisH

Do you close the file?

I'm pretty sure output is buffered and if the file is not closed
properly it will not get flushed to disk.

Cheers
 
C

ChrisH

Geoff said:
Thanks, I appreciate it. For some reason the output is the same as the
input when I try this though. Not sure why it does not work.

It occurred to me this morning (what else am I going to think about on
the bus 9^) that since your able to read the file with the
double-quotes, you need to check for missing field using '.empty?'
rather than '= nil'

cheers
 
G

Geoff

Sweet... that's certainly an improvement, but as you mention I do need
to retain the double quotes!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,050
Latest member
AngelS122

Latest Threads

Top