1

我想将从 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 文件?

4

3 回答 3

4

如果要将 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我通过 YAML-land 显示 CSV 数据的正确往返得到此输出:

[[“名字”,“家庭电话”,“邮政编码”],
 [“道格拉斯”,“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'))instead of load_file,它将部件重新组合成一个数组。

于 2013-01-24T15:44:30.380 回答
0

如果您的行数据是哈希(看起来是),请尝试使用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>)
于 2013-01-24T08:29:17.280 回答
-1
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
于 2013-01-24T08:23:11.947 回答