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

Ruby Read File And Convert It To An Array

我想阅读这个文本文件:

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

并将其转换为这样的数组:

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

所以我想,我可以很容易地获取和读取国家名称,代码可以 return 首都名称。也许这个解决方案会很糟糕,但我不知道。

我这样试过:

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

我怎样才能在 ruby 中做到这一点?

改变

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

userarr << line.split(',')

您需要用逗号分隔,而不是 space。

使用Enumerable#flat_map

这个单行代码会做你想做的,返回一个展平的数组。您当然可以将其分解为多个方法调用以进行调试或提高可读性,但它按发布的方式工作。

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

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

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