如何使用Ruby将CSV文件转换为YAML文件?

时间:2017-02-01 10:15:56

标签: ruby csv yaml

我有一个CSV文件,其中包含网址,完全限定域名(FQDN),域名,IP地址和IP地址范围。我想以下列格式将其转换为YAML文件:

entity:    
  name: "company name"   
  network_names:
    url: 
      - 'scheme://host:port/path?query'
      - 'http://www.example.com/software/index.html'
    fqdn:
      - 'mymail.somecollege.edu'
    domain:
      - 'somecollege.edu'


  network_addresses:
    ipv4:
      single_ip: 
        - 111.11.111.1
      range: 
        - 111.11.111.0-111.11.11.255

问题是所有内容都混合在CSV文件中,例如在第一行有IP地址但在下一行有一个URL或FQDN。

所以我认为我需要检查一行是否包含IP地址,URL,FQDN或域,并从那里构建YAML文件。

但是如何指定YAML文件的字段?我是Ruby编程和YAML的新手。

2 个答案:

答案 0 :(得分:1)

在这里,我们使用Faker红宝石来生成虚拟数据

来自.csv文件

//output
hey 2
hey 8

到.yaml文件

name,email,title,phone_number
Lawerence Kautzer,hedwig@lockman.name,Manufacturing Director,(548) 162-1670 x8532
Mrs. Walter Renner,man@pacocha.org,Legacy Legal Liaison,779-428-7453 x26055

执行此操作

---
- :name: Lawerence Kautzer
  :email: hedwig@lockman.name
  :title: Manufacturing Director
  :phone_number: "(548) 162-1670 x8532"
- :name: Mrs. Walter Renner
  :email: man@pacocha.org
  :title: Legacy Legal Liaison
  :phone_number: 779-428-7453 x26055

谢谢

答案 1 :(得分:0)

这是一个基本结构。 CSV.parse可以返回一组行(可以看作是哈希)。数组和散列都可以轻松转换为YAML:

require 'yaml'
require 'csv'

csv = "ip,something,domain
x,y,z
a,b,c
m,n,o"

data = []

CSV.parse(csv, headers: true).each do |row|
  hash = row.to_h
  # hash looks like :
  # {"ip"=>"x", " something"=>"y", " domain"=>"z"}
  # Apply desired logic to it
  data << hash
end

puts data.to_yaml
# ---
# - ip: x
#   something: y
#   domain: z
# - ip: a
#   something: b
#   domain: c
# - ip: m
#   something: n
#   domain: o