0

オブジェクトを開いて作成するテキスト ファイルがあります。次のようになります。

/home/music/Accident Murderer.mp3|4:37|    Nas       |    Accident Murderer
/home/music/Bitch Bad.mp3        |4:49| Lupe   Fiasco|    Bitch Bad
/home/music/ITAL.mp3             |4:24| Lupe   Fiasco|    ITAL(Roses)
/home/music/The Coolest.mp3      |5:13| Lupe   Fiasco|    The Coolest

次に、次のコードを使用して曲オブジェクトを作成しています。

songs = SongList.new
songFile = File.open('./songs.txt')
songFile.each do |line|
  file, length, name, title = line.chomp.split(/\s*\|\s*/)
  name.squeeze!(" ")
  mins, secs = length.scan(/\d+/)
  songs.append Karaoke::Song.new(title, name, mins.to_i*60+secs.to_i)
end

ただし、次のエラー メッセージが表示されます。

songlist.rb:40:in `block in <class:SongList>': undefined method `squeeze!' for nil:NilClass (NoMethodError).

誰か助けてください。なぜ「絞る!」なのかわかりません。未定義のメソッドです。Stringクラスのメソッドですよね?

4

1 に答える 1

1

処理している空白行がある可能性はありますか? おそらくファイルの最後に?それは に分割されるので["",nil,nil,nil]、表示されているエラーが発生します。. .namenil

そのための修正は次のようになります。

songs = SongList.new
songFile = File.open('./songs.txt')
songFile.each do |line|
  next if line.chomp.empty?
  file, length, name, title = line.chomp.split(/\s*\|\s*/)
  raise "Got less than four columns, line '#{line.chomp}'" if title == nil 
  name.squeeze!(" ")
  mins, secs = length.scan(/\d+/)
  songs.append Karaoke::Song.new(title, name, mins.to_i*60+secs.to_i)
end

next単純な空の行をスキップする必要がありますが、「入力ファイルではOKですが、スクリプトのデータは含まれていません」として扱いたいものをスキップするように変更できます。

行が最初は問題ないように見えても、予期せず最後の列が欠落している場合にエラーを発生させる単純な検証も追加しました。私は通常、このアプローチをお勧めします。コードの外部から来るデータの処理中の少なくともいくつかの段階で、それが実際に期待または必要なものであることを確認する必要があります。

実際にスキップしても問題ないと見なされるものと、入力ファイルのエラーはあなた次第です。この変更により、少なくとも何が問題なのかについての手がかりが得られるはずです。

于 2013-04-14T19:51:36.273 に答える