rubyでxlsファイルをtsvファイルに変換するプログラムです。
標準入力からxlsファイルを読み込む場合には、Spreadsheet.openで直接読み込もうとするとエラーになるため、いったんTempfileに書き込んでおいて、Tempfileから読み直すようにしています。
#!/usr/local/bin/ruby
#
# usage: xls_to_tsv.rb [xls] > {tsv}
#
$KCODE = 'u'
require 'jcode'
require 'rubygems'
require 'spreadsheet'
# 引数
xls_file = nil
if ARGV.length == 0
tf = Tempfile.new('xls_to_tsv')
data = STDIN.read
tf.write(data)
tf.rewind
xls_file = tf
elsif ARGV.length == 1
xls_file = ARGV[0]
else
STDERR.print("usage: xls_to_tsv.rb [xls] > {tsv}\n")
exit(1)
end
# sheet
book = Spreadsheet.open(xls_file)
sheet = book.worksheet(0)
0.upto(sheet.row_count - 1) do |r|
tsv_values = []
0.upto(sheet.column_count - 1) do |c|
if sheet[r, c].class == Spreadsheet::Formula
value = sheet[r, c].value.to_s
elsif ! sheet[r, c]
value = ''
else
value = sheet[r, c].to_s
end
tsv_values.push(value)
end
print(tsv_values.join("\t") + "\n")
end
# 標準入力の場合
if ARGV.length == 0
xls_file.close
end
標準入力からxlsファイルを読み込む場合には、Spreadsheet.openで直接読み込もうとするとエラーになるため、いったんTempfileに書き込んでおいて、Tempfileから読み直すようにしています。
#!/usr/local/bin/ruby
#
# usage: xls_to_tsv.rb [xls] > {tsv}
#
$KCODE = 'u'
require 'jcode'
require 'rubygems'
require 'spreadsheet'
# 引数
xls_file = nil
if ARGV.length == 0
tf = Tempfile.new('xls_to_tsv')
data = STDIN.read
tf.write(data)
tf.rewind
xls_file = tf
elsif ARGV.length == 1
xls_file = ARGV[0]
else
STDERR.print("usage: xls_to_tsv.rb [xls] > {tsv}\n")
exit(1)
end
# sheet
book = Spreadsheet.open(xls_file)
sheet = book.worksheet(0)
0.upto(sheet.row_count - 1) do |r|
tsv_values = []
0.upto(sheet.column_count - 1) do |c|
if sheet[r, c].class == Spreadsheet::Formula
value = sheet[r, c].value.to_s
elsif ! sheet[r, c]
value = ''
else
value = sheet[r, c].to_s
end
tsv_values.push(value)
end
print(tsv_values.join("\t") + "\n")
end
# 標準入力の場合
if ARGV.length == 0
xls_file.close
end