Как извлечь данные из строки в ruby? - PullRequest
0 голосов
/ 02 мая 2018

У меня есть файл с 10-метровыми строками, каждая из которых выглядит так:

{ "_id" : ObjectId("567f972cad55ac0797baa773"), "id" : 357103 }

Для каждой строки мне нужно что-то сделать со значением "id".

Пока у меня есть:

listings.each.with_index do |line, idx|
  # listing_id = JSON.parse(line).fetch("id") #>> invalid JSON error
  # line.split('"id : "') #=> some gibberish
  line.match(/"id" : (.*)/)[1] #=> "357103 }"

parse выдает ошибку, что строки недопустимы json. split возвращает немного бреда. Ближайший результат, который я получил к своим ожиданиям, был match, но он возвращается для приведенного выше примера "357103 }".

Не могли бы вы помочь мне исправить это?

Ответы [ 4 ]

0 голосов
/ 02 мая 2018

Расщепление здесь происходит быстрее, чем регулярное. С таким большим файлом это может иметь заметное значение.

Кроме того, похоже, что вам нужно избегать этих двойных кавычек: line.split("\"id\" : ")

> puts Benchmark.measure{line.split("\"id\" : ").last.delete('}').delete(' ')}
  0.000000   0.000000   0.000000 (  0.000020)

> puts Benchmark.measure{line.match(/\s(\d+)\s/)[1]}
  0.000000   0.000000   0.000000 (  0.000043)

Обновление

Еще быстрее, используйте расщепление до конца:

> puts Benchmark.measure{line.split("\"id\" : ").last.split(' ').first }
  0.000000   0.000000   0.000000 (  0.000008)

Редактировать

Хотя, как Стефан упоминает в своем комментарии, похоже, что ваш файл BSON (MongoDB), а не JSON. Существует монго самоцвет .

0 голосов
/ 02 мая 2018

Идентификаторы составлены из всех чисел? Вы можете попробовать использовать регулярное выражение, которое ищет двоеточие, а затем список чисел.

Line.match(/"id " : [0-9]+/)

Ищет Id, за которым следует любая длина целых чисел.

Если в нем есть буквы и цифры, то:

Line.match(/"id" :[[:alnum:]]+/)
0 голосов
/ 02 мая 2018

Вы можете просто сопоставить, используя сплайсинг:

line[/(?<= )\d+/] = 357103
0 голосов
/ 02 мая 2018

Вы можете использовать регулярное выражение \s(\d+)\s, анализ JSON не требуется.

line.match(/\s(\d+)\s/)[1] #=> "357103"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...