Как разобрать LARGE JSON-файлы с ошибкой форматирования - PullRequest
0 голосов
/ 08 мая 2019

У меня есть куча больших файлов JSON (> 500 МБ), которые я хотел бы проанализировать с помощью скрипта ruby ​​(я пытаюсь. Проанализировать его с помощью гема YAJL).

Я заметил, что файлы JSON имеют ошибки форматирования, так что все файлы состоят из «нескольких» объектов JSON без правильной древовидной структуры или массива. Ниже вы можете найти, как выглядит файл JSON:

testfile.json:

{title: "Don Quixote", author: "Miguel de Cervantes", printyear: 2010}
{title: "Great Gatsby", author: "F. Scott Fitzgerald", printyear: 2014}
{title: "Ulysses", author: "James Joyce", printyear: 2010}

Это скрипт для разбора файла:

require 'yajl'
json = File.new('testfile.json', 'r')
hash = Yajl::Parser.parse(json)

Вот сообщение об ошибке, которое я получаю:

Yajl::ParseError: Found multiple JSON objects in the stream but no block or the on_parse_complete callback was assigned to handle them.

Буду признателен, если вы поможете мне решить эту проблему.

Ответы [ 2 ]

3 голосов
/ 08 мая 2019

Полученное сообщение об ошибке ( «Обнаружено несколько объектов JSON в потоке…» ) означает, что ваш ввод содержит несколько, но допустимых объектов JSON, поэтому я предполагаю, что ваш фактический файл выглядит больше похоже на это:

{"title":"Don Quixote","author":"Miguel de Cervantes","printyear":2010}
{"title":"Great Gatsby","author":"F. Scott Fitzgerald","printyear":2014}
{"title":"Ulysses","author":"James Joyce","printyear":2010}

Одной из функций YAJL является:

Непрерывный анализ и кодирование нескольких объектов JSON в потоки или строки и обратно непрерывно.

Таким образом, учитывая приведенный выше ввод (в виде файла или строки), вы можете передать блок в parse, который будет вызываться для каждого анализируемого объекта:

require 'yajl'

io = File.open('testfile.json')

Yajl::Parser.parse(io) do |book|
  puts "“#{book['title']}” by #{book['author']} (#{book['printyear']})"
end

Выход:

“Don Quixote” by Miguel de Cervantes (2010)
“Great Gatsby” by F. Scott Fitzgerald (2014)
“Ulysses” by James Joyce (2010)
0 голосов
/ 08 мая 2019

Не используйте JSON.parse, потому что содержимое файла не является JSON.Каждая строка в этом файле выглядит как хэш Ruby, поэтому можно использовать другой метод синтаксического анализа.

Вы должны иметь возможность анализировать каждую строку с помощью: YAML.load(line).

Кроме того, выделитеФайл большой, не загружайте весь файл в память.Используйте File.foreach для загрузки построчно.

require 'yaml'

lines = []
File.foreach('testfile.json') do |line|
  lines << YAML.load(line)      
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...