#ruby-on-rails #ruby #json #bash #streaming
#ruby-on-rails #ruby #json #bash #потоковая передача
Вопрос:
Я довольно новичок в ruby, поэтому вопрос может быть простым.
Я ищу библиотеку ruby, которая поможет мне проанализировать большой файл JSON (порядка 100 МБ)
Особенность этого JSON-файла в том, что он создается набором процессов и не имеет корневого элемента. Представьте, что файл выглядит так
//this is element 1
{
"name":"person 1",
"dresses":[{"type":"pants","color":"green"},{"type":"shirt","color":"green"},{"type":"t-shirt","color":"green"}],
"age":"34"
}
//this is element 2
{
"name":"person 2",
"dresses":[{"type":"pants","color":"blue"},{"type":"shirt","color":"red"}],
"age":"33"
}
Поскольку таких элементов много (около 3M), мне нужно найти способ, чтобы я мог получать несколько элементов за раз, или обрабатывать входные данные как поток, если это возможно, и записывать каждый из элементов в текстовый файл после некоторой обработки на основе значений, как
- У парня 34 лет есть три предмета одежды, включая пару зеленых штанов
- У парня 33 лет две одежды и нет футболки
По сути, это почти как синтаксический анализ XML с использованием sax parser, но без корневого элемента. Не могли бы вы предложить хорошую библиотеку ruby для выполнения этой работы?
Ответ №1:
Если это строки, и вы загружаете только несколько за раз, вы можете просто использовать JSON.parse .
Например:
a = '{
"name":"person 1",
"dresses":[{"type":"pants","color":"green"},{"type":"shirt","color":"green"},{"type":"t-shirt","color":"green"}],
"age":"34"
}'
b = JSON.parse(a)
b['name']
=> 'person 1'
или, если вы предпочитаете символы (я делаю!)
b = JSON.parse(a).deep_symbolize_keys!
b[:name]
=> 'person 1'
Если вам действительно нужна машина, похожая на SAX, это экспериментальный камень: https://github.com/brianmario/json-machine
Комментарии:
1. спасибо за драгоценный камень. Файл поставляется в строках, а не по одной строке на элемент. Что я сделал, так это изменил файлы . Но если бы это были строки, я бы предпочел подход, описанный здесь.