2
votes

Comment lire un fichier json ligne par ligne dans R?

Voici les données brutes json :

json_file <-  '[{"name":"Doe, John","group":"Red","age":{"v_0":24}},
    {"name":"Doe, Jane","group":"Green","age":{"v_0":31}},
    {"name":"Smith, Joan","group":"Yellow","age":{"v_0":22}}]'

Lorsque je veux convertir json_file en un bloc de données:

Error: parse error: trailing garbage
      :"Red","age":{"v_0":24}}     {"name":"Doe, Jane","group":"Gr
                 (right here) ------^

J'obtiens cette erreur:

library(RJSONIO)
json_file <- fromJSON(json_file)

Je sais que si je change les données brutes pour les données suivantes, tout ira bien:

json_file <-  '{"name":"Doe, John","group":"Red","age":{"v_0":24}}
    {"name":"Doe, Jane","group":"Green","age":{"v_0":31}}
    {"name":"Smith, Joan","group":"Yellow","age":{"v_0":22}}'

Mais en fait, j'aimerais savoir:

1) Comment obtenir une trame de données à partir des données brutes sans diviser ses objets en utilisant [, , et ?

2) S'il n'y a aucun moyen, comment diviser des objets dans un gros json code> en ajoutant , à la fin de chaque ligne à l'exception de la dernière ligne, et en ajoutant également [ et ] à la première et à la dernière ligne de le fichier?


3 Réponses :


1
votes

Vos données json brutes sont déjà divisées en objets individuels. De plus, dans l'ensemble, les données json ne sont pas valides. Heureusement, comme vous l'avez remarqué, si vous insérez , à la fin de chaque ligne (sauf la dernière) et mettez le tout entre crochets, vous obtenez une collection de paires de clés (ou tableaux). Vous devriez donc plutôt demander: "Comment combiner tous les éléments en un seul data.frame?"

La solution: dplyr::bind_rows(fromJSON(json_file))

json_file <- paste0('[', json_file, ']')

Suivi:

En supposant que les objets json ne contiennent pas de retours à la ligne , vous pouvez effectuer une recherche-remplacement facile:

json_file <- gsub('\n', ',', trimws(json_file), fixed=TRUE)

J'ai mis les trimws pour supprimer les éventuelles nouvelles lignes de fin.

Ensuite, vous l'entourez de crochets:

# A tibble: 3 x 3
  name        group    age
  <chr>       <chr>  <dbl>
1 Doe, John   Red       24
2 Doe, Jane   Green     31
3 Smith, Joan Yellow    22

et vous êtes de retour sur la bonne voie.


4 commentaires

Donc, je dois insérer , à la fin de chaque ligne, attendre la dernière et mettre manuellement les données brutes entre crochets? Maintenant, que faire si j'ai un gros fichier json ?


Définissez «grand».


Lorsque nous avons beaucoup d'objets comme 10000 objets.


Cela ne devrait pas être un problème dans R.



-1
votes

Vous avez besoin de ces crochets. Enregistrez ce qui suit sous 'test.json':

print(result)
$ID
[1] "1" "2" "3" "4" "5" "6" "7" "8"

$Name
[1] "Rick"     "Dan"      "Michelle" "Ryan"     "Gary"     "Nina"     "Simon"    "Guru"    

$Salary
[1] "623.3"  "515.2"  "611"    "729"    "843.25" "578"    "632.8"  "722.5" 

$StartDate
[1] "1/1/2012"   "9/23/2013"  "11/15/2014" "5/11/2014"  "3/27/2015"  "5/21/2013"  "7/30/2013"  "6/17/2014" 

$Dept
[1] "IT"         "Operations" "IT"         "HR"         "Finance"    "IT"         "Operations" "Finance"

Maintenant, chargez la bibliothèque requise et pointez sur ce fichier que vous venez d'enregistrer:

# Load the package required to read JSON files.
library("rjson")

# Give the input file name to the function.
result <- fromJSON(file = "C:\\Users\\Excel\\Documents\\test.json")

# Print the result.
print(result)

Résultat:

{ 
   "ID":["1","2","3","4","5","6","7","8" ],
   "Name":["Rick","Dan","Michelle","Ryan","Gary","Nina","Simon","Guru" ],
   "Salary":["623.3","515.2","611","729","843.25","578","632.8","722.5" ],

   "StartDate":[ "1/1/2012","9/23/2013","11/15/2014","5/11/2014","3/27/2015","5/21/2013",
      "7/30/2013","6/17/2014"],
   "Dept":[ "IT","Operations","IT","HR","Finance","IT","Operations","Finance"]
}


0 commentaires

2
votes

Il existe des moyens de le faire sans avoir à modifier le fichier.

Si vous voulez un data.frame:

json_data_as_list <- readLines("path/to/file.json") %>% lapply(fromJSON)

ou si vous voulez une liste:

library(jsonlite)
# url
zips <- stream_in(url("http://media.mongodb.org/zips.json"))
# file
json_data <- stream_in(file("path/to/file.json"))


0 commentaires