2017-02-01 8 views
-2

У меня есть файл CSV, в котором содержатся URL-адреса, Полноценные доменные имена (FQDN), Домены, IP-адреса и диапазоны IP-адресов. И я хотел бы, чтобы преобразовать его в файл YAML следующий формат:Как преобразовать CSV-файл в файл YAML с помощью Ruby?

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-адрес или полное доменное имя.

Так что я думал, что мне нужно проверить, содержит ли строка IP-адрес, URL-адрес, полное доменное имя или домен и из него создается файл YAML.

Но как указать поля для файла YAML? Я новичок в программировании Ruby и YAML.

+1

Как выглядит ваш CSV? –

+0

Размер CSV и сколько строк? Я бы написал свой собственный парсер, положил его в хэш, а затем использовал * Hash.to_yaml * – Roger

+1

Как выглядит ваш код? С какой * конкретной * частью у вас есть проблема? Вы получили сообщение об ошибке? Который из? Получаете ли вы неправильные результаты? Какие результаты вы получите и какие результаты вы хотите? Пожалуйста, предоставьте нам [mcve]. –

ответ

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