[英]private method `puts' called for nil:NilClass (NoMethodError)
[英]private method `puts' called for “string”:String (NoMethodError)
我正在使用ruby:1.9.3
名为restaurant.txt的文件,其数据如下:
|"Aloo Fry"| "Carbohydrates bahut hai" | "Nahi Khana"
|"Moong"| "protein bahut hai" | "Khana Hai"
|"Egg"|"Protein hai but non veg"| "Nahi khana hai"
现在,我要做的是获取最后一个字符串并删除现有行。 输出文件必须是相同的文件,并且应类似于:
Nahi Khana Khana Hai Nahi Khana hai
if ARGV.length != 1
puts "Input only the one file at a time"
exit
end
foodie = ARGV[0]
puts "you have entered file: #{foodie}"
puts "Hold your horses... we are processing"
File.open(foodie, "r+").each do |line|
new_line = line.split("|")[-1]
puts new_line
line.puts new_line
end
我收到错误消息:
private method `puts' called for "Nahi Khana":String (NoMethodError)
@Whooper已确定您的代码有问题。 因此,我选择建议另一种构建所需文件的方法。
让我们首先构造一个包含示例中给出的字符串的文件。
FName = 'temp'
str =<<END
|"Aloo Fry"| "Carbohydrates bahut hai" | "Nahi Khana"
|"Moong"| "protein bahut hai" | "Khana Hai"
|"Egg"|"Protein hai but non veg"| "Nahi khana hai"
END
File.write(FName, str)
#=> 149 (characters)
确认其内容:
puts File.read(FName)
|"Aloo Fry"| "Carbohydrates bahut hai" | "Nahi Khana"
|"Moong"| "protein bahut hai" | "Khana Hai"
|"Egg"|"Protein hai but non veg"| "Nahi khana hai"
您可以读取文件,并使用带有简单正则表达式的String#scan和Array#join构造要保留的字符串。
s = File.read(FName).scan(/\"[^|]+$/).join("\n")
#=> "\"Nahi Khana\"\n\"Khana Hai\"\n\"Nahi khana hai\"\n"
puts s
"Nahi Khana"
"Khana Hai"
"Nahi khana hai"
正则表达式的内容为:“将双引号与除管道( "|"
)以外的所有其他字符匹配到该行的末尾”。 每次匹配均以该行最后一个管道之后的第一个双引号开头。
最后,将s
写回到同一文件,覆盖其内容。
File.write(FName, s)
#=> 42
看一看。
puts File.read(FName)
"Nahi Khana"
"Khana Hai"
"Nahi khana hai"
IO :: read的使用有时称为吞入文件 (作为字符串)。 1只要文件不是太大就可以了。 如果文件很大,则可能需要逐行读取文件,修改该行,然后将其写入临时文件。 临时文件完成后,可以删除原始文件,如果需要,可以将临时文件重命名为原始文件的名称。 您可以按照以下步骤进行操作。
TMP_FName = 'tmp'
f = File.open(TMP_FName, 'w')
File.foreach(FName) do |line|
f.puts line.scan(/\"[^|]+$/).join("\n")
end
f.close
File.delete(FName)
File.rename(TMP_FName, FName)
确认:
puts File.read(FName)
"Nahi Khana"
"Khana Hai"
"Nahi khana hai"
1我不知道是否有使用IO#write的可比术语; 也许将字符串分解为文件 。 虽然read
和write
的IO
(类)方法,它们通常involked的类File
。 可以,因为File.superclass #=> IO
,所以File
从IO
继承了这些方法。
此语句line.puts new_line
导致错误。
我假设您要在此处实现的目的是将new_line写入输出文件,也许您认为line
是一个File对象,而不是,因为line
是包含从输入文件读取的每一行的string
。 此外,您的File.open方法read-only state
因此您无法在该文件上写入。
因此,我建议您首先将每个new_line
存储在一个列表中,然后在处理完输入文件中的所有行之后,进行另一个循环,在该循环中您将覆盖文件以反映得到的结果。
if ARGV.length != 1
puts "Input only the one file at a time"
exit
end
foodie = ARGV[0]
puts "you have entered file: #{foodie}"
puts "Hold your horses... we are processing"
new_lines = []
File.open(foodie, "r+").each do |line|
new_lines.push(line.split("|")[-1])
end
File.open(foodie, "w+") do |file|
new_lines.each { |element| file.puts(element) }
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.