这可能很难解释,但我会尽力的。
假设我有一个文本文件,其中包含:
variable one
I'm variable 2
300
False
I am variable 5
让我们假设我有多个这样的文件,并且我不知道每个文件中的内容。我想将文件中的每一行放入一个变量中。
例如,此文件将成为以下变量(我可以使用if
语句将其分为字符串,数字和布尔值):
var1 = "variable one"
var2 = "I'm variable 2"
var3 = 300
var4 = False
var5 = "I am variable 5"
我想确保可以将其应用于任何行数的文件。
这是我希望代码看起来像的一个例子:
File.open("file.txt").each do |line|
var.new = "var" + line.line_number #creates new variable named "var" and the line number
var = line
end
我希望有人能理解并知道该怎么做,因为我完全陷入了困境。我觉得这里有一种非常简单的解决方案,每个人都知道,但我很想念它,或者我只是不知道。
谢谢,里斯(Reece)
答案 0 :(得分:1)
这回答了您的问题,但是以与您的应用程序实际相关的方式执行此操作当然需要上下文。
这不一定是唯一的方法,甚至不一定是“最佳”的方法,但我认为这是最简单的方法:
basename()
如果要将$url = "https://www.example.com/images/assets/screenshots/this-is-an-example/2016-12-20_15-42-29.png";
$endOfUrl = strpos($url, '/assets/') !== false ? basename($url) : '';
echo $endOfUrl;
和File.read("file.txt").split("\n").each_with_index do |line, index|
instance_variable_set("@var#{index}", line)
end
@var0 #variable one
@var1 #I'm variable 2
从字符串(即从文件中读取的字符串)转换为ruby对象,则必须进行一些手动解析。说,
False
也许您只想将文件读取为数组。
300
答案 1 :(得分:0)
感觉就像您真的想要一个数组。为此,您可以将文件直接读入数组,每行一个条目:
array_of_lines = File.readlines("file.txt")
array_of_lines[0]
=> "variable one\n"
array_of_lines[1]
=> "300\n"
等
答案 2 :(得分:0)
您可以将其作为具有内置解析逻辑的类来实现(我只处理了给定的示例):
class VarGroup
attr_reader :vars
def initialize(file_name)
@vars = File.foreach(file_name).map do |l|
if l =~ /(True|False)/i
l.match?(/True/i)
else
begin
Integer(l)
rescue ArgumentError
l.strip
end
end
end
end
def method_missing(method_name,*args,&block)
if method_name =~ /var(\d+)/ && $1.to_i.nonzero? && $1.to_i <= vars.size
@vars[$1.to_i - 1]
else
super
end
end
end
然后可以像
一样调用它v = VarGroup.new('test.txt')
v.vars
#=> ["variable one", "I'm variable 2", 300, false, "I am variable 5"]
(1..6).each do |n|
p v.public_send("var#{n}")
end
# "variable one"
# "I'm variable 2"
# 300
# false
# "I am variable 5"
# undefined method `var6' for #<VarGroup:0x000055a23e2f64e0>