2011-03-26 60 views
0

试图映射的东西,我从文件中读取到有一个整数和一个字符串数组的 列表分配映射阵列直接

它似乎不工作很正确,因为我看到 两个字符串每个数组,而不是一个整数 和一个字符串。

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

代替你能给line_counts.txt的样本线? – steenslag 2011-03-26 23:23:02

回答

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"]] 

这似乎是你追求的。

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 
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 

我使用的地图,而不是为每个输出,因为你可以在TextMate中两次打标签,它构建块给你。

list_of_elems.map { |e| puts e.to_s } 
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}