如何在Ruby中读取文件时去除换行符

10
我将尝试消除打印出来的方括号 [] 和换行符 \n
我的代码如下:
name1 = File.readlines('first.txt').sample(1)
name2 = File.readlines('middle.txt').sample(1)
name3 = File.readlines('last.txt').sample(1)

name = print (name1.strip 
    print name2.strip 
    print name3.strip)

puts name

我希望输出结果看起来像 JoshBobbyGreen。 然而,它看起来像:
[\"Josh\\n\"][\"Bobby\\n\"][\"Green\\n\"]

我尝试使用 .gsubchompsplit,但可能我使用方法不正确。

6个回答

33

同时考虑在File.readlines中使用可选的chomp参数。

File.readlines("/path/to/file", chomp: true)

12

puts 在输出结束时添加一个换行符。print 不会。 使用 print 命令,它可能解决您的问题。此外使用 .strip。

"\tgoodbye\r\n".strip   #=> "goodbye"

我得到了这个错误 fullname.rb:36:in strip': wrong number of arguments (1 for 0) (ArgumentError) from yahoo.rb:36:in <main>' - marriedjane875

3

您的代码存在一个小问题,导致您遇到了当前的结果。

当您使用以下代码时:

name1 = File.readlines('first.txt').sample(1)

返回值不是字符串,而是包含1个随机样本的数组。例如:
["Jhon"]

当你使用print时,你会得到输出["Jhon"]。这就是为什么你需要期望(并且更喜欢)一个字符串,尝试使用下面的代码代替:
name1 = File.readlines('first.txt').sample(1)[0]
name2 = File.readlines('middle.txt').sample(1)[0]
name3 = File.readlines('last.txt').sample(1)[0]

或者:

name1 = File.readlines('first.txt').sample(1).pop
name2 = File.readlines('middle.txt').sample(1).pop
name3 = File.readlines('last.txt').sample(1).pop

或者,可能是您的意思,如果没有参数,sample会返回一个对象而不是数组:
name1 = File.readlines('first.txt').sample
name2 = File.readlines('middle.txt').sample
name3 = File.readlines('last.txt').sample

此外,在打印时,最好创建一个字符串来包含您想要的所有空格和格式。例如:
name1 = File.readlines('first.txt').sample(1).pop
name2 = File.readlines('middle.txt').sample(1).pop
name3 = File.readlines('last.txt').sample(1).pop

puts "#{name1} #{name2} #{name3}."
# or
print "#{name1} #{name2} #{name3}."

1
如果:
name1 = ["Josh\n"]
name2 = ["Bobby\n"]
name3 = ["Green\n"]

它只是:

puts [name1, name2, name3].map { |a| a.first.strip }.join('')
  #=> JoshBobbyGreen

我为什么要使用&:strip?因为我得到了一个在map中未定义的strip方法,对于...的错误。 - marriedjane875
抱歉,我不明白。你在运行时是否遇到了异常?我确信代码没问题。顺便说一下,map(&:strip)map { |s| s.strip } 产生的结果相同。 - Cary Swoveland
我不确定 &:strip 是否是一个打字错误。 - marriedjane875
但它说“在map中:未定义'strip'方法” - marriedjane875
这非常奇怪。 name1 name2name3是字符串,而Class string肯定有一个方法strip。对我来说,在Ruby v2.2下该代码运行良好(我认为这不可能是版本问题)。您是否使用了我的定义的name1name2name3?如果没有,我需要知道这些变量的值以诊断问题。 - Cary Swoveland
显示剩余7条评论

0
为了避免冗余的 \n,我宁愿使用 split
File.read('first.txt').split("\n") # double quotes are important!

为了避免在使用数组时没有参数使用sample方法:
File.read('first.txt').split("\n").sample

-1
puts %w(first middle last).map { |e| IO.readlines("#{e}.txt").sample.strip }.join

如果它有效,请给答案点个赞,谢谢。 :) - sbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接