rubyのsplitではまる

仕事でEXCELから出力したタブ区切りのファイルをWEBシステムにアップロードするというやつをやった。
ところが、出力ファイルの行末のタブの数が行によって違っていて、エラーになって取り込めない。
ruby使って以下のようにやってみた。
io = open(ARGV[0])
line=nil
while line=io.gets
  line.chomp!
  s = line.split(/\t/)
  print line
  print( "\t" * ( ARGV[1] - s.length ) )
  puts
end
ところがこれじゃうまく動かない。タブの数が余計に出力される。
なぜだかわからず、結構悩んでしまった。

これはsplitの仕様のせい。
"A\tB".split → [ "A", "B" ]
"A\t\tB".split → [ "A","", "B" ]
だが
"A\t\t".split → [ "A" ]
となってしまうのが原因。空文字と区切り文字が後続する部分は切り捨てられてしまう。

念のためPerl5.8で試したみたところ同様の動作を行ってた。
うーん、個人的には"A\t\t".split → [ "A" ,"",""]になってくれたほうがうれしい気がするのだが。

今回は
io = open(ARGV[0])
line=nil
while line=io.gets
  line.chomp!
  s = line.split(/\t/)
  print s,join("\t")
  print( "\t" * ( ARGV[1] - s.length ) )
  puts
end

で逃げた。
[PR]
by nora1962 | 2009-04-14 05:03 | PC
<< ruby dbi とRDBMS rubyで[BUG] Segm... >>