[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

script runs ok alone, broken pipe when piped to head?

Dave Burns

3/13/2008 10:34:00 PM

Maybe I need to close the file or something?

This invokation runs fine, but generates *so* much output:

ruby -rubygems excelparse.rb stuff.xls

so I piped it to head and it bombs:

ruby -rubygems excelparse.rb stuff.xls|head
Row: 0 Cell: 0> Dispapp
Row: 0 Cell: 1> Iprc
Row: 0 Cell: 2> UH tag
Row: 0 Cell: 3> Weight
Row: 0 Cell: 4> Tags removed
Row: 0 Cell: 5> Disk removed or wiped
Row: 1 Cell: 0> 80118
Row: 1 Cell: 1> 1173
Row: 1 Cell: 2> 961SU
Row: 2 Cell: 0> 80118
excelparse.rb:19:in `write': Broken pipe (Errno::EPIPE)
from excelparse.rb:19:in `puts'
from excelparse.rb:19
from excelparse.rb:15:in `each'
from excelparse.rb:15
from /usr/lib/ruby/gems/1.8/gems/parseexcel-0.5.2/lib/parseexcel/worksheet.rb:143:in
`each'
from /usr/lib/ruby/gems/1.8/gems/parseexcel-0.5.2/lib/parseexcel/worksheet.rb:143:in
`each'
from excelparse.rb:11

Any hints? The script itself is a minor mod of the example given at
the parseexcel site (see below).

Mahalo,
Dave


cat excelparse.rb
require 'parseexcel'

#Open the excel file passed in from the commandline
workbook = Spreadsheet::ParseExcel.parse(ARGV[0])

#Get the first worksheet
worksheet = workbook.worksheet(0)

j=0
#cycle over every row
worksheet.each { |row|
i=0
if row != nil
#cycle over each cell in this row if it's not an empty row
row.each { |cell|
if cell != nil
#Get the contents of the cell as a string
contents = cell.to_s('latin1')
puts "Row: #{j} Cell: #{i}> #{contents}"
end
i = i+1
}
end
j=j+1
}

5 Answers

Arlen Cuss

3/13/2008 10:56:00 PM

0

[Note: parts of this message were removed to make it a legal post.]

Hi,

On Fri, Mar 14, 2008 at 9:34 AM, Dave Burns <tburns@hawaii.edu> wrote:

> Row: 1 Cell: 1> 1173
> Row: 1 Cell: 2> 961SU
> Row: 2 Cell: 0> 80118
> excelparse.rb:19:in `write': Broken pipe (Errno::EPIPE)
> from excelparse.rb:19:in `puts'
> from excelparse.rb:19
> from excelparse.rb:15:in `each'
> from excelparse.rb:15
> from /usr/lib/ruby/gems/1.8/gems/parseexcel-0.5.2
> /lib/parseexcel/worksheet.rb:143:in
> `each'
> from /usr/lib/ruby/gems/1.8/gems/parseexcel-0.5.2
> /lib/parseexcel/worksheet.rb:143:in
> `each'
> from excelparse.rb:11
>
> Any hints? The script itself is a minor mod of the example given at
> the parseexcel site (see below).


It's a very random guess, but is the EPIPE possibly happening because `head'
closed the connection after reading 10 lines? What happens if you run it
like this..?
ruby -rubygems excelparse.rb stuff.xls 2>&1 | less


Arlen

Mark Bush

3/13/2008 11:05:00 PM

0

Dave Burns wrote:
> so I piped it to head and it bombs:
>
> ruby -rubygems excelparse.rb stuff.xls|head
> Row: 0 Cell: 0> Dispapp
> Row: 0 Cell: 1> Iprc
> Row: 0 Cell: 2> UH tag
> Row: 0 Cell: 3> Weight
> Row: 0 Cell: 4> Tags removed
> Row: 0 Cell: 5> Disk removed or wiped
> Row: 1 Cell: 0> 80118
> Row: 1 Cell: 1> 1173
> Row: 1 Cell: 2> 961SU
> Row: 2 Cell: 0> 80118
> excelparse.rb:19:in `write': Broken pipe (Errno::EPIPE)

The "head" command reads and prints the first 10 lines of input (by
default), then closes its input and exits.

Your script is thus having it's output stream closed which it isn't
expecting. The broken pipe is to be expected.

--
Posted via http://www.ruby-....

Dave Burns

3/14/2008 12:30:00 AM

0

On Mar 13, 1:04 pm, Mark Bush <m...@bushnet.org> wrote:
> Dave Burns wrote:
> > so I piped it to head and it bombs:
>
> > ruby -rubygems excelparse.rb stuff.xls|head
> > Row: 0 Cell: 0> Dispapp
> > Row: 0 Cell: 1> Iprc
> > Row: 0 Cell: 2> UH tag
> > Row: 0 Cell: 3> Weight
> > Row: 0 Cell: 4> Tags removed
> > Row: 0 Cell: 5> Disk removed or wiped
> > Row: 1 Cell: 0> 80118
> > Row: 1 Cell: 1> 1173
> > Row: 1 Cell: 2> 961SU
> > Row: 2 Cell: 0> 80118
> > excelparse.rb:19:in `write': Broken pipe (Errno::EPIPE)
>
> The "head" command reads and prints the first 10 lines of input (by
> default), then closes its input and exits.
>
> Your script is thus having it's output stream closed which it isn't
> expecting. The broken pipe is to be expected.
>

So to get my script to act like a responsible command line citizen,
I'd need to insert some error handling and return normally when the
pipe breaks, right?

Thanks for the info.
Dave

Mark Bush

3/14/2008 8:51:00 AM

0

Dave Burns wrote:
> So to get my script to act like a responsible command line citizen,
> I'd need to insert some error handling and return normally when the
> pipe breaks, right?

Since your script is, basically, in the business of doing IO, then yes,
it is probably worth catching IO exceptions and exiting cleanly.

--
Posted via http://www.ruby-....

Robert Klemme

3/16/2008 9:41:00 PM

0

On 14.03.2008 01:30, Dave Burns wrote:
> On Mar 13, 1:04 pm, Mark Bush <m...@bushnet.org> wrote:
>> Dave Burns wrote:
>>> so I piped it to head and it bombs:
>>> ruby -rubygems excelparse.rb stuff.xls|head
>>> Row: 0 Cell: 0> Dispapp
>>> Row: 0 Cell: 1> Iprc
>>> Row: 0 Cell: 2> UH tag
>>> Row: 0 Cell: 3> Weight
>>> Row: 0 Cell: 4> Tags removed
>>> Row: 0 Cell: 5> Disk removed or wiped
>>> Row: 1 Cell: 0> 80118
>>> Row: 1 Cell: 1> 1173
>>> Row: 1 Cell: 2> 961SU
>>> Row: 2 Cell: 0> 80118
>>> excelparse.rb:19:in `write': Broken pipe (Errno::EPIPE)
>> The "head" command reads and prints the first 10 lines of input (by
>> default), then closes its input and exits.
>>
>> Your script is thus having it's output stream closed which it isn't
>> expecting. The broken pipe is to be expected.
>
> So to get my script to act like a responsible command line citizen,
> I'd need to insert some error handling and return normally when the
> pipe breaks, right?

Well, it depends. If you consider it an error when the script is not
able to deliver all output the default behavior is ok. I usually do not
bother to deal with this situation because I use head and tail from the
command line only and I know what to expect there.

Kind regards

robert