Ruby读取文件并将其转换为数组

时间:2015-12-06 18:49:28

标签: arrays ruby indexing find

我想阅读此文本文件:

Almanya,Berlin
Andorra,Andorra La Vella
Arnavutluk,Tiran
Avusturya,Viyana
Belarus,Minsk

并将其转换为如下数组:

country = ["Almanya","Berlin","Andorra","Andorra La Vella"...]

所以我想,我可以很容易地获取和阅读国家名称,代码可以返回大写名称。也许这个解决方案可能很糟糕,但我不知道。

我试过这样:

File.open('login.txt') do |f|
     f.lines.each do |line|
       userarr << line.split.map(&:to_s)
     end
end

但结果是:

[["Almanya,Berlin"], ["Andorra,Andorra", "La", "Vella"],...]

我怎么能在红宝石中做到这一点?

3 个答案:

答案 0 :(得分:2)

使用Enumerable#flat_map

这个单行将做你想要的,返回一个扁平的阵列。您当然可以将其分解为多个方法调用以进行调试或读取,但它可以发布。

File.readlines('/tmp/corpus').map(&:chomp).flat_map { |line| line.split ?, }

答案 1 :(得分:0)

更改

userarr << line.split.map(&:to_s)

userarr << line.split(',')

您需要拆分逗号,而不是空格。

答案 2 :(得分:0)

只需将文件读入字符串并分成逗号和换行符:

File.read("my_file").split(/,|\n/)
  #=> ["Almanya", "Berlin", "Andorra", Andorra La Vella", "Arnavutluk",
  #    "Tiran", "Avusturya", "Viyana", "Belarus", "Minsk"]

要消除任何前导或尾随空格,请点击.map(&:strip)或将正则表达式更改为/\s*,\s*|\s*\n\s*/

如果文件很大,您可以一次读取一行:

File.foreach("my_file").flat_map { |s| s.split(/\s*,\s*|\s*\n\s*/) }
  #=>["Almanya", "Berlin", "Andorra", "Andorra La Vella", "Arnavutluk",
  #   "Tiran", "Avusturya", "Viyana", "Belarus", "Minsk"]