红宝石分裂的问题

时间:2017-07-15 11:22:49

标签: arrays ruby

我的目标是读取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 ,我不希望这样。第三,如果我用puts替换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

是的,有人可以赐教我吗?谢谢

3 个答案:

答案 0 :(得分:4)

\n表示换行符。

  • 您的文本文件最后有一个新的(空白行),因此它实际上有4行。
  • 带有\n的return语句中的最后一个数组代表 文本文件末尾的空行。
  • 每个数组中的最后一个元素都有一个\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

如果您希望输出看起来与文本文件中的内容相似,则可以使用puts

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

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

stackoverflow answer可能会有所帮助,因为它讨论了Ruby中putsprint之间的差异。

article解释了Ruby中putsprintp之间的区别。

<强>更新

要从示例中移除\n个新行,请在条件之前添加placing = placing.chomp

您还可以将!运算符与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

答案 1 :(得分:3)

您想要line.chomp.split(',')

chomp从字符串末尾删除换行符。

答案 2 :(得分:1)

有很多方法可以删除\nchompstrip

请尝试以下代码:

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

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