У меня есть строка с названием «пример», например:
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}
Но я не знаю, как мне сделать другие изменения. Спасибо!!
3 ответа
Ну, чтобы получить его как рубиновый хеш, который вы можете вывести как json или как вам нужно:
out = {}
your_input_data.split(",").each_with_index { |val, i| out["string#{i}"] = val }
(но вам нужно будет сделать это для каждой строки: input.lines.each {| line | ... сделайте то же самое здесь} - но я не понимаю - вам нужен список карт?)
Я сделал предположение, что вы не хотите, чтобы значения, которые были просто числами, заключались в двойные кавычки.
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}
Из написанного вами кода кажется, что вы ищете одну строку в качестве вывода, а не более сложную структуру данных 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
сначала с запятыми, а затем с новой строкой. Если у вас есть списки, а не пересобранные строки, просто опустите соответствующее соединение.
Похожие вопросы
Новые вопросы
ruby
Ruby - это многоплатформенный динамический объектно-ориентированный интерпретируемый язык с открытым исходным кодом. Тег [ruby] предназначен для вопросов, связанных с языком Ruby, включая его синтаксис и его библиотеки. Вопросы Ruby on Rails должны быть помечены [ruby-on-rails].