尝试将我从文件中读取的内容映射到 具有整数和字符串
的数组列表似乎没有正常工作,因为我看到了 每个数组两个字符串,而不是整数 和一个字符串。
list_of_elems = []
File.foreach("line_counts.txt") do |line|
list_of_elems << arr = line.split(/\s+/).map! { |e, i| i == 0 ? e.to_i : e }
end
list_of_elems.each_with_index do |e, i|
if i > 10
break
end
p e
end
答案 0 :(得分:1)
如果我理解得很好,你想要这样的文件:
test 20 foo
7 1 bar 6
得到这个:
[["test", 20, "foo"],
[7, 1, "bar", 6]]
右?
然后你可以使用:
list_of_elems = []
File.foreach("line_counts.txt") do |line|
list_of_elems << line.split(/\s+/).map {|e| e =~ /^(?:+|-)?\d+$/ ? e.to_i : e }
end
或者:
list_of_elems = File.read("line_counts.txt").split("\n").map do |line|
line.split(/\s+/).map {|e| e =~ /^(?:+|-)?\d+$/ ? e.to_i : e }
end
答案 1 :(得分:1)
这可能不太相关,但
list_of_elems.each_with_index do |e, i|
if i > 10
break
end
p e
end
可以替换为
list_of_elems[0..10].each {|e| p e}
答案 2 :(得分:0)
你的问题是map!
只将一个参数传递给块;因此i
总是nil
,i == 0
总是失败,永远不会调用to_i
。我想你想要更像这样的东西:
list_of_items = File.open('line_counts.txt').collect do |line|
line.split(/\s+/).inject([ ]) { |a, e| a.push(a.length == 0 ? e.to_i : e) }
end
a.length == 0
基本上取代了您错误的i == 0
检查,并将该行的第一个组成部分转换为整数。
如果linecounts.txt
看起来像这样:
1 one
2 two
然后list_of_items
看起来像这样:
[[1, "one"], [2, "two"]]
这似乎就是你所追求的目标。
答案 3 :(得分:0)
这也应该有效:
list_of_elems = File.foreach("line_counts.txt").map |line|
line.split.map.with_index { |e, i| i == 0 ? e.to_i : e }
end
我使用map代替每个输出,因为你可以在textmate中按Tab键两次,然后为你构建块。
list_of_elems.map { |e| puts e.to_s }