2017-07-15 16 views
1

私の目的は、txt.fileを読み込み、内容を配列に分割することです。しかし私はsplitコマンドに問題があります。ruby​​ splitの問題

私のテキストファイルの内容は、この

アコスタ、1,3,0,0,0
Amezcua、2,1,2,0,2
アバロス、0,1,1であります0,0

私のPowerShellは、この

を返すしかし私のコードは、この

file = open("score2.txt", "r") 

file.each do |line| 
    array = line.split(",") 
    print array 
end 

です

["Acosta", "1", "3", "0", "0", "0\n"]["Amezcua", "2", "1", "2", "0", "2\n"]["Avalos", "0", "1", "1", "0", "0\n"]["\n"] 

私はPowerShellの出力から得られるものと混同しています。まず、私のtxtには3行だけが含まれています。なぜpowershellが3の代わりに4つの配列を出力するのですか?第二に、なぜ最後のすべての配列の要素には\ nが含まれていますが、私はそれを望んでいません。第3にprintをputsに置き換えた場合、配列の最後の要素には\ nという問題はありません。どうしてこんなことに?

追加するには、配列の最後の要素から\ nを削除する理由を説明します。 txt文書内の数字は、トーナメントにおける個人の配置を表し、例えば、アコスタ、1,3,0,0,0は、アコスタが最初の試合で最初に配置され、2番目の試合で3番目、残りの試合に配置されないことを意味します。それで、私は各個人をスコアリングし、最終的に各人の合計スコアを印刷することに基づいてポイントシステムを割り当てたいと思います。

。したがってI起因\ nに配列の最後の要素でしかし

file = open("score2.txt", "r") 

file.each do |line| 
    array = line.split(",") 
    name = array.shift 
    score = 0 
    array.each do |placing| 
    if placing == "1" 
     score += 6 
    elsif placing == "2" 
     score += 4 
    elsif placing == "3" 
     score += 2 
    else 
     score = score 
    end 
    end 
    print "#{name}: #{score} " 
end 

に従うようにスコアを割り当てるifelsif配列を使用する、私はトーナメントの最後のマッチにポイントを割り当てることができません。したがって、配列の最後の要素から\ nを削除します。

この練習問題はhttp://www.evc-cit.info/cit020/beginning-programming/chp_05/exercises2.htmlです。

親切に私を啓発することはできますか?ありがとうございます

答えて

4

\nは改行文字を表します。

  • テキストファイルの最後に新しい(空白行)があるため、実際には4行あります。
  • returnステートメントの最後の配列\nは、テキストファイルの最後に空白の改行がある を表します。
  • 各配列の最後の要素は、\n文字です。これは、各配列がテキストファイル内の各行を表すためです。各行の後に新しい行(\n文字で表される)が続きます。
  • Rubyでは、putsは各引数の最後に改行を追加し、print\nを使用して改行を表します。

あなたは出力から\nを削除したい場合は、このようなあなたのコードを簡素化することができます:あなたは出力から\nを削除しますが、新しい行を保持したい場合は

open("score2.txt", "r") 

file.each do |line| 
    print line.split 
end 

、あなたの代わりにprintpを使用することができます。

open("score2.txt", "r") 

file.each do |line| 
    p line.split 
end 

あなたWA場合あなたは、テキストファイルで持っているもののように見えるためにあなたの出力は、あなたがputsを使用することができNT:

open("score2.txt", "r") 

file.each do |line| 
    puts line.split 
end 

それはRubyでputsprintとの違いについて説明しますので、これstackoverflow answerは、役に立つかもしれません。

このarticleは、Rubyのputs,print、およびpの違いを説明しています。

更新:

あなたの条件文の前にplacing = placing.chompを追加し、あなたの例から\n新しい行を削除します。

また、すなわちchomp!場所にplacing文字列を変更するchompで強打!演算子を使用することができます。

file = open("score2.txt", "r") 

file.each do |line| 
    array = line.split(",") 
    name = array.shift 
    score = 0 
    array.each do |placing| 
    placing.chomp! 
    if placing == "1" 
     score += 6 
    elsif placing == "2" 
     score += 4 
    elsif placing == "3" 
     score += 2 
    else 
     score = score 
    end 
    end 
    print "#{name}: #{score} " 
end 
+0

こんにちはどのように私は、配列の最後の要素から\ nを削除しますか? – roppo

+0

こんにちは私は私の答えを更新しました –

+0

こんにちは、私は私の質問では不明であると思う、あなたは親切に私のqnsのAGNを読むことができる? – roppo

3

あなたはline.chomp.split(',')をしたいです。

chompは、文字列の最後から改行を削除します。 chompよう\nを削除するために利用できる方法がたくさんある

1

strip

次のコードを試してみては:

file = open("score2.txt", "r") 

file.each do |line| 
    array = line.chomp.split(",") 
    array1 = line.strip.split(",") 
    print array 
    print array1 
end