【问题标题】:How do I write values parsed from a CSV file to a YAML file?如何将从 CSV 文件解析的值写入 YAML 文件?
【发布时间】:2013-01-24 08:16:29
【问题描述】:

我想将从 CSV 文件解析的值写入 YAML 文件:

home_phone = row['HomePhone']
 if home_phone.length == 10  
  puts "First Name: #{row['first_Name']} - Home Phone: #{home_phone} -  Zip Code: #{zip_code}"
  elsif home_phone.length == 11 && home_phone.start_with?('1')   
  home_phone.slice!(0)
      puts "First Name: #{row['first_Name']} - Home Phone: #{home_phone} -  Zip Code: #{zip_code}"   
  else  
      puts "First Name: #{row['first_Name']} - Home Phone: #{"0000000000"} -  Zip Code: #{zip_code}"      
  end

以上代码用于逐行打印详细信息。从代码中得到的输出是:

First Name: Douglas - Home Phone: 4252745000 -  Zip Code: 50309'

'First Name: Aya - Home Phone: 9995901339 -  Zip Code: 90210'

'First Name: Audrey - Home Phone: 0 -  Zip Code: 05667'

如何将这些值写入 YAML 文件?

【问题讨论】:

    标签: ruby-on-rails ruby yaml


    【解决方案1】:

    如果您想将 CSV 文件转换为 YAML...

    我创建了一个名为“test.csv”的文件,如下所示:

    名字,家庭电话,邮政编码 道格拉斯,4252745000,50309 绫,9995901339,90210 奥黛丽,0,05667

    使用此代码:

    require 'csv'
    require 'yaml'
    
    csv = CSV.read('test.csv')
    File.write('test.yaml', csv.to_yaml)
    pp YAML.load_file('test.yaml')
    

    生成:

    --- - - 名 - 家庭电话 - 邮政编码 - - 道格拉斯 - '4252745000' - '50309' - - 绫 - '9995901339' - '90210' - - 奥黛丽 - '0' - '05667'

    我从pp 得到这个输出,显示了 CSV 数据通过 YAML-land 的正确往返:

    [[“名字”,“家庭电话”,“邮政编码”], [“道格拉斯”,“4252745000”,“50309”], [“绫”,“9995901339”,“90210”], [“奥黛丽”,“0”,“05667”]]

    这只是一个简单的解决方案,它将整个 CSV 文件加载到内存中。如果您处理的文件大于系统上的可用 RAM,这不是一个可扩展的解决方案。 CSV 支持foreach,它可以让你逐行读取文件,但 YAML 可能会因为它生成文件的方式而难以逐行写入文件;它需要一个完整的哈希或数组,但您将向它传递子数组,这将导致 YAML 文件看起来像:

    --- - - 名 - 家庭电话 - 邮政编码 --- - - 道格拉斯 - '4252745000' - '50309' --- - - 绫 - '9995901339' - '90210' --- - - 奥黛丽 - '0' - '05667'

    使用YAML.load_file 加载会导致:

    [ [0] [ [0] "名字", [1]“家庭电话”, [2]“邮政编码” ] ]

    也就是说,只会返回第一行。

    解决方法是使用YAML.load_documents(File.open('test.yaml', 'r')) 而不是load_file,这会将部分重新组合成一个数组。

    【讨论】:

      【解决方案2】:

      如果您的行数据是散列(看起来是),请尝试像这样使用to_yaml

      File.open(<path to your output file here>, "w") { |f| f.write(row.to_yaml) }
      

      然后你可以像这样阅读它:

      YAML.load_file(<path to your output file here>)
      

      【讨论】:

        【解决方案3】:
        require 'yaml'
        File.open('somefile.yaml','w') do |f|
          f.write(row['first_Name'])
          f.write(row['home_phone'])
          f.write(row['zip_code'])
        end
        

        【讨论】:

        • 这根本不会生成 YAML。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 2013-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多