2016-09-08 3 views
0

У меня есть файл .txt с этой структуройКак читать несколько структур JSON, содержащихся в одном файле?

section1#[{"p": "0.999834", "tag": "MA"},{"p": "1", "tag": "MO"},...etc...}] 
section1#[{"p": "0.9995", "tag": "NC"},{"p": "1", "tag": "FL"},...etc...}] 
... 
section2#[{"p": "0.9995", "tag": "NC"},{"p": "1", "tag": "FL"},...etc...}] 

Я пытаюсь читать его с помощью R с командами

library(jsonlite) 
data <- fromJSON("myfile.txt") 

Но я получаю эту

Error in feed_push_parser(readBin(con, raw(), n), reset = TRUE) : 
    lexical error: invalid char in json text. 
             section2#[{"p": "0.99 
        (right here) ------^ 

Как можно Я читал его даже разбив по разделам?

+1

Возможно, вам необходимо вручную прочитать файлы с помощью 'readLines', удалить часть' section' и передать ее в 'fromJSON'. – Psidom

+0

Что такое такой файл? – MrFlick

+0

он исходит из mySQL – pachamaltese

ответ

4

Удалить префикс и связать уплощенной JSON массивы вместе в кадр данных:

raw_dat <- readLines(textConnection('section1#[{"p": "0.999834", "tag": "MA"},{"p": "1", "tag": "MO"}] 
section1#[{"p": "0.9995", "tag": "NC"},{"p": "1", "tag": "FL"}] 
section2#[{"p": "0.9995", "tag": "NC"},{"p": "1", "tag": "FL"}]')) 

library(stringi) 
library(purrr) 
library(jsonlite) 

stri_replace_first_regex(raw_dat, "^section[[:digit:]]+#", "") %>% 
    map_df(fromJSON) 
##   p tag 
## 1 0.999834 MA 
## 2  1 MO 
## 3 0.9995 NC 
## 4  1 FL 
## 5 0.9995 NC 
## 6  1 FL 
+0

Большое вам спасибо. Я не создавал этот файл, он поступает из общедоступных данных. Это было именно то, чего я боялся, структура json была недействительной. – pachamaltese

1

Удалить section# с каждой строки. Тогда ваш .txt будет иметь 2D-массив с объектами JSON по каждому индексу. Вы можете получить доступ к элементам путем доступа к нему, как foo[0][0] является первым объектом первой линии и foo[m][n] где m является number of sections -1 и n является number of objects in each section -1

+1

На самом деле он все равно не будет действительным файлом JSON, если вы удалите префикс. Файл JSON должен иметь один корневой элемент. Вам нужно будет иметь упаковку '[]' и иметь ',' в конце каждой строки. Это больше похоже на формат [JSON line] (http://jsonlines.org/). – MrFlick

+0

@MrFlick Это не будет файл JSON, но это будет 2D-массив. –

+0

Ну, это не массив JSON. Вы говорите о чтении данных с помощью 'readLines()' или что-то еще? Как вы оцениваете это в R, чтобы сделать 2D-массив? – MrFlick