2017-07-15 231 views
1

我的目標是讀取txt.file,並將內容分割成數組。然而,我對split命令有問題。紅寶石分割問題

我的文本文件,內容是這樣的

阿科斯塔,1,3,0,0,0
Amezcua,2,1,2,0,2
阿瓦洛斯,0,1,1, 0,0

我的代碼是這樣的

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

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

但是我PowerShell會返回這個

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

我對我從powershell輸出中得到的東西感到困惑。首先我的txt只包含三行,爲什麼powershell打印出4個數組而不是3個?其次,爲什麼每個最後一個數組的元素包含\ n,我不希望這樣。第三,如果我用put替換print,那麼對於數組的每個最後一個元素,我都不會有\ n的問題;爲什麼?

爲了補充,我將解釋爲什麼我想從數組的最後一個元素中移除\ n的原因。 txt文檔中的數字表示將某個人放入比賽中, Acosta,1,3,0,0,0意味着Acosta在第一場比賽中獲得第一名,在第二場比賽中獲得第三名,並且在剩下的比賽中沒有進球。因此,我想根據每個人的得分情況來分配一個積分系統,並最終打印出每個人的總得分。

因此,我使用的ifelsif序列來分配分數作爲遵循

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 

然而,由於在陣列中的最後一個元素\ N,我無法點分配給比賽的最後一場比賽。因此我想從數組的最後一個元素中刪除\ n。

這個練習是從http://www.evc-cit.info/cit020/beginning-programming/chp_05/exercises2.html

有人能夠賜教嗎?謝謝

回答

4

\n代表一個新的行字符。

  • 您的文本文件最後有一個新的(空白行),所以它實際上有4行。
  • 返回語句中的最後一個數組與\n代表文本文件末尾的 空行。
  • 每個數組中的最後一個元素都有一個\n字符,因爲每個數組表示您的文本文件中的每一行。每行後面跟着一個新行(由\n字符表示)。
  • 在Ruby中,puts在每個參數的末尾添加了一個新行,而print使用\n來表示新行。

如果你想從你的輸出刪除\n,你可以簡化你的代碼是這樣的:

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

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

如果你想刪除輸出的\n,但保留新線,你可以使用p代替print

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

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

如果はNT的輸出看起來像你在你的文本文件的東西,你可以使用puts

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

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

stackoverflow answer可能是有益的,因爲它討論了puts和紅寶石print之間的差異。

這個article解釋了Ruby中的puts,printp之間的差異。

更新:

要從例如刪除\n新的生產線,您的條件語句前加上placing = placing.chomp

您還可以使用爆炸!運營商chomp到即chomp!修改placing串到位:

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從字符串末尾刪除換行符。

1

有很多方法可以去除\nchompstrip

試試下面的代碼:

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

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