У меня есть строка с названием «пример», например:

192.168.1.40,8.8.8.8,12.34.45.56,408, -, 1812
192.168.1.128,192.168.101.222,12.34.45.56 384, -, 1807

И я хотел бы получить такой вывод:

{«строка1»: «192.168.1.40», «строка2»: «8.8.8.8», «строка3»: «12.34.45.56», «строка4»: 408, «строка5»: «-», «строка6»: 1812 } {«строка1»: «192.168.1.128», «строка2»: «192.168.101.222», «строка3»: «12.34.45.56», «строка4»: 384, «строка5»: «-», «строка6»: 1807}

Я сделал это:

example = example.gsub("\n","}\n{\"string1\": \"")                         
example = example.insert(0, "{\"string1\": \"")                  
example = example.concat("}")                                    

И я получил:

{"строка1": "192.168.1.40,8.8.8.8,12.34.45.56,408, -, 1812} {" строка1 ":" 192.168.1.128,192.168.101.222,12.34.45.56,384, -, 1807}

Но я не знаю, как мне сделать другие изменения. Спасибо!!

1
user3489973 23 Июн 2014 в 03:52

3 ответа

Лучший ответ

Ну, чтобы получить его как рубиновый хеш, который вы можете вывести как json или как вам нужно:

out = {}
your_input_data.split(",").each_with_index { |val, i| out["string#{i}"] = val  }

(но вам нужно будет сделать это для каждой строки: input.lines.each {| line | ... сделайте то же самое здесь} - но я не понимаю - вам нужен список карт?)

3
Michael Neale 23 Июн 2014 в 04:03

Я сделал предположение, что вы не хотите, чтобы значения, которые были просто числами, заключались в двойные кавычки.

DATA.each_line do |line|
    l = line.chomp.split(',').map.with_index do |v, i|
        v = v =~ /^\d+$/ ? v : "\"#{v}\""
        "\"string#{i+1}\":#{v}"
    end
    print "{", l.join(','), "}\n"
end

__END__
192.168.1.40,8.8.8.8,12.34.45.56,408,-,1812
192.168.1.128,192.168.101.222,12.34.45.56,384,-,1807

Результат:

{"string1":"192.168.1.40","string2":"8.8.8.8","string3":"12.34.45.56","string4":408,"string5":"-","string6":1812}
{"string1":"192.168.1.128","string2":"192.168.101.222","string3":"12.34.45.56","string4":384,"string5":"-","string6":1807}
1
Jonathan 23 Июн 2014 в 04:16

Из написанного вами кода кажется, что вы ищете одну строку в качестве вывода, а не более сложную структуру данных Ruby или вывод в печатный поток.

Это работает для меня:

example = '192.168.1.40,8.8.8.8,12.34.45.56,408,-,1812
192.168.1.128,192.168.101.222,12.34.45.56,384,-,1807'

result = example.split("\n").map do |line| 
  n = 0 
  line.split(',').map{|s| %Q|"string#{n+=1}":"#{s}"|}.join(',')
end.map{|c| "{#{c}}"}.join("\n")

puts result

{"string1":"192.168.1.40","string2":"8.8.8.8","string3":"12.34.45.56","string4":"408","string5":"-","string6":"1812"}
{"string1":" 192.168.1.128","string2":"192.168.101.222","string3":"12.34.45.56","string4":"384","string5":"-","string6":"1807"}

Он разбивается на строки, затем разбивает каждую строку на отдельные строки, затем объединяет каждую строку с ее ключом JSON и, наконец, повторно собирает с помощью join сначала с запятыми, а затем с новой строкой. Если у вас есть списки, а не пересобранные строки, просто опустите соответствующее соединение.

0
Gene 23 Июн 2014 в 05:01