Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > csv nil check and update

Reply
Thread Tools

csv nil check and update

 
 
Geoff
Guest
Posts: n/a
 
      03-15-2006
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

 
Reply With Quote
 
 
 
 
James Edward Gray II
Guest
Posts: n/a
 
      03-15-2006
On Mar 15, 2006, at 2:23 PM, Geoff wrote:

> 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


 
Reply With Quote
 
 
 
 
Geoff
Guest
Posts: n/a
 
      03-15-2006
That does give me some ideas... thanks!

Now:

"Initialize" cannot convert nil to a string.

Any ideas on that one?

 
Reply With Quote
 
Geoff
Guest
Posts: n/a
 
      03-15-2006
Got it, nevermind!

Thanks a ton for your help.

 
Reply With Quote
 
ChrisH
Guest
Posts: n/a
 
      03-15-2006
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[i].size - 1){|j|
csvData[i][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

 
Reply With Quote
 
Geoff
Guest
Posts: n/a
 
      03-15-2006
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.t xt") do |row|
if row[-1].empty?
row[-1] = last
else
last = row[-1]
end
newFile << (p row)
end

Ideas?

Thanks!

Geoff

 
Reply With Quote
 
Geoff
Guest
Posts: n/a
 
      03-15-2006
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.

 
Reply With Quote
 
James Edward Gray II
Guest
Posts: n/a
 
      03-16-2006
On Mar 15, 2006, at 5:48 PM, Geoff wrote:

> 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.t xt") 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


 
Reply With Quote
 
ChrisH
Guest
Posts: n/a
 
      03-16-2006
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

 
Reply With Quote
 
ChrisH
Guest
Posts: n/a
 
      03-16-2006
Geoff wrote:
> 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

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
["test string\n", nil] i need to strip \n and nil Bigmac Turdsplash Ruby 15 09-08-2009 09:19 AM
Integer(nil) versus Float(nil) versus String(nil) Christoffer Sawicki Ruby 5 09-02-2006 06:28 PM
a == nil or a.nil? ako... Ruby 6 11-23-2005 05:03 AM
RCR 303: nil should accept missing methods and return nil John Carter Ruby 64 05-19-2005 12:12 PM
puts nil generates "nil\n" Brian Candler Ruby 1 11-06-2004 01:59 PM



Advertisments