rubyでtsvファイルからxlsファイルを生成するプログラムで、Spreadsheet::Workbook#writeで標準出力に出力しようとするとエラーになりますが、データをTempfileに出力して、Tempfileからデータを読み直して標準出力に出力することができます。
#!/usr/local/bin/ruby
#
# usage: tsv_to_xls.rb [xls] < {tsv}
#
$KCODE = 'u'
require 'jcode'
require 'rubygems'
require 'spreadsheet'
# 引数
xls_file = nil
if ARGV.length == 0
xls_file = Tempfile.new('tsv_to_xls')
elsif ARGV.length == 1
xls_file = ARGV[0]
else
STDERR.print("usage: tsv_to_xls.rb [xls] < {tsv}\n")
exit(1)
end
# sheet
book = Spreadsheet::Workbook.new
sheet = book.create_worksheet
# tsv 読み込み
STDIN.each_with_index do |line, r|
a = line.chomp.split("\t")
a.each_with_index do |value, c|
sheet[r, c] = value
end
end
# 出力
book.write(xls_file)
# 標準出力へ
if ARGV.length == 0
xls_file.rewind
data = xls_file.read
STDOUT.write(data)
end
#!/usr/local/bin/ruby
#
# usage: tsv_to_xls.rb [xls] < {tsv}
#
$KCODE = 'u'
require 'jcode'
require 'rubygems'
require 'spreadsheet'
# 引数
xls_file = nil
if ARGV.length == 0
xls_file = Tempfile.new('tsv_to_xls')
elsif ARGV.length == 1
xls_file = ARGV[0]
else
STDERR.print("usage: tsv_to_xls.rb [xls] < {tsv}\n")
exit(1)
end
# sheet
book = Spreadsheet::Workbook.new
sheet = book.create_worksheet
# tsv 読み込み
STDIN.each_with_index do |line, r|
a = line.chomp.split("\t")
a.each_with_index do |value, c|
sheet[r, c] = value
end
end
# 出力
book.write(xls_file)
# 標準出力へ
if ARGV.length == 0
xls_file.rewind
data = xls_file.read
STDOUT.write(data)
end