【问题标题】:Ruby Read File And Convert It To An ArrayRuby 读取文件并将其转换为数组
【发布时间】:2016-03-11 07:54:40
【问题描述】:

我想阅读这个文本文件:

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

我怎样才能在 ruby​​ 中简单地做到这一点?

【问题讨论】:

    标签: arrays ruby indexing find


    【解决方案1】:

    使用Enumerable#flat_map

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

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

    【讨论】:

      【解决方案2】:

      改变

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

      userarr << line.split(',')
      

      你需要在逗号上分割,而不是在空格上。

      【讨论】:

        【解决方案3】:

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

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

        要消除任何前导或尾随空格,请添加.map(&amp;: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"] 
        

        【讨论】:

          猜你喜欢
          • 2014-09-16
          • 2016-11-25
          • 1970-01-01
          • 1970-01-01
          • 2021-04-04
          • 1970-01-01
          • 2015-04-17
          • 2012-09-19
          • 1970-01-01
          相关资源
          最近更新 更多