jq: продолжить синтаксический анализ, игнорируя недопустимые литералы - PullRequest
0 голосов
/ 17 июня 2020

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

jq: parse error: Invalid numeric literal at line 3524768, column 0

Я проверил строку 3524768, и она показывает отлично JSON.

{"created_at":"Mon Jul 18 08:02:46 +0000 2016","id":754949520631496704,"id_str":"754949520631496704","text":"je regarde le monde de charlotte et si je le finis t\u00f4t je regarde Caroline","source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":2760400101,"id_str":"2760400101","name":"m.d.r","screen_name":"eoalfd","location":"nevers","url":null,"description":"emmenez-moi voir odezenne | hugo&mel","protected":false,"verified":false,"followers_count":683,"friends_count":262,"listed_count":15,"favourites_count":6493,"statuses_count":42605,"created_at":"Wed Sep 03 14:55:50 +0000 2014","utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"lang":"fr","contributors_enabled":false,"is_translator":false,"profile_background_color":"000000","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_link_color":"F5ABB5","profile_sidebar_border_color":"000000","profile_sidebar_fill_color":"000000","profile_text_color":"000000","profile_use_background_image":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/753684703450923008\/U-11Brew_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/753684703450923008\/U-11Brew_normal.jpg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/2760400101\/1468624180","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[],"urls":[],"user_mentions":[],"symbols":[]},"favorited":false,"retweeted":false,"filter_level":"low","lang":"fr","timestamp_ms":"1468828966659"}

Фильтр, который я применяю (который работает, кроме этой конкретной строки), выглядит следующим образом:

jq '. as $parent |.text | match("#(?!(p[0-9])|([0-9])|(q[0-9]|_))[a-zA-Z0-9]+") as $result | {"time":$parent.timestamp_ms,"string":$result.string}'

Фактически, когда я просто извлекаю строку 3524768 в изолированный файл и запускаю свой парсер jq, он работает отлично ! Есть ли способ заставить мой парсер jq работать, несмотря на эту буквальную ошибку numeri c? Может, проигнорировав это и продолжу со следующей строчки? Я застрял в этом пару дней, любая помощь будет отличной.

1 Ответ

1 голос
/ 17 июня 2020

Возможно, номер строки в сообщении об ошибке сбился на единицу.

В любом случае для восстановления после ошибки вы можете использовать идиому, проиллюстрированную следующим:

def process:
  try (inputs | type) 
  catch ("error at line \(input_line_number)", process);

process

В такой программе вы обычно вызываете jq с -n аргумент командной строки.

Пример

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

def myfilter:
  . as $parent 
  | .text
  | match("#(?!(p[0-9])|([0-9])|(q[0-9]|_))[a-zA-Z0-9]+") as $result
  | {"time":$parent.timestamp_ms,"string":$result.string} ;

def process:
  try (inputs | myfilter) 
  catch ("error at line \(input_line_number)", process);

process
...