Convertir fichier JSON dans un fichier CSV à l'aide de R
J'ai le fichier JSON dans un .txt fichier que je suis en train de charger dans R, mais j'obtiens l'erreur suivante:
Error in feed_push_parser(readBin(con, raw(), n), reset = TRUE) :
parse error: trailing garbage
" : "SUCCESS" } /* 1 */ { "_id" : "b736c374-b8ae-4e9
(right here) ------^
Je suis en supposant que l'erreur est à cause de plusieurs instances de /* (nombre) */et je ne peux pas les supprimer manuellement toutes mes fichier a 10k instances de ces. Est-il un moyen de supprimer de tels cas, avant de charger les données dans la R?
Mon fichier JSON se présente comme suit:
/* 0 */
{
"_id" : "93ccbdb6-8947",
"uiSearchRequest" : {
"travelDate" : 20151206,
"travelDuration" : 7,
"shopperDuration" : 30,
"oneWay" : false,
"userId" : "ATP1KKP",
"queryId" : "93ccbdb6-8947",
"subRequests" : [{
"origin" : "WAS",
"destination" : "LON",
"carrier" : "AA",
"fareClasses" : "",
"owrt" : "1,2"
}]
},
"downloadCount" : 0,
"requestDate" : 20151205,
"totalRecords" : 0,
"status" : "SUCCESS"
}
/* 1 */
{
"_id" : "b736c374-b8ae",
"uiSearchRequest" : {
"travelDate" : 20151206,
"travelDuration" : 7,
"shopperDuration" : 30,
"oneWay" : false,
"userId" : "ATP1KKP",
"queryId" : "b736c374-b8ae",
"subRequests" : [{
"origin" : "WAS",
"destination" : "LON",
"carrier" : "AA",
"fareClasses" : "",
"owrt" : "1,2"
}]
},
"downloadCount" : 0,
"requestDate" : 20151205,
"totalRecords" : 0,
"status" : "SUCCESS"
}
/* 2 */
{
"_id" : "3312605f-8304",
"uiSearchRequest" : {
"travelDate" : 20151206,
"travelDuration" : 7,
"shopperDuration" : 30,
"oneWay" : false,
"userId" : "ATP1SXE",
"queryId" : "3312605f-8304",
"subRequests" : [{
"origin" : "LON",
"destination" : "IAD",
"carrier" : "AA",
"fareClasses" : "",
"owrt" : "1,2"
}]
},
"downloadCount" : 2,
"requestDate" : 20151205,
"totalRecords" : 0,
"status" : "SUCCESS"
}
/* 3 */
{
"_id" : "6b668cfa-9b79",
"uiSearchRequest" : {
"travelDate" : 20151206,
"travelDuration" : 7,
"shopperDuration" : 30,
"oneWay" : false,
"userId" : "ATP1NXA",
"queryId" : "6b668cfa-9b79",
"subRequests" : [{
"origin" : "WAS",
"destination" : "LON",
"carrier" : "AA",
"fareClasses" : "",
"owrt" : "1,2"
}]
},
"downloadCount" : 1,
"requestDate" : 20151205,
"totalRecords" : 1388,
"status" : "SUCCESS"
}
/* 4 */
{
"_id" : "41c373a1-e4cb",
"uiSearchRequest" : {
"travelDate" : 20151206,
"travelDuration" : 7,
"shopperDuration" : 30,
"oneWay" : false,
"userId" : "ATP6CXS",
"queryId" : "41c373a1-e4cb",
"subRequests" : [{
"origin" : "WAS",
"destination" : "LON",
"carrier" : "AA",
"fareClasses" : "",
"owrt" : "1,2"
}]
},
"downloadCount" : 0,
"requestDate" : 20151205,
"totalRecords" : 1388,
"status" : "SUCCESS"
}
/* 5 */
{
"_id" : "2c8331c4-21ca",
"uiSearchRequest" : {
"travelDate" : 20151206,
"travelDuration" : 7,
"shopperDuration" : 30,
"oneWay" : false,
"userId" : "ATP1KKP",
"queryId" : "2c8331c4-21ca",
"subRequests" : [{
"origin" : "WAS",
"destination" : "LON",
"carrier" : "AA",
"fareClasses" : "",
"owrt" : "1,2"
}]
},
"downloadCount" : 0,
"requestDate" : 20151205,
"totalRecords" : 1388,
"status" : "SUCCESS"
}
/* 6 */
{
"_id" : "71a09900-1c13",
"uiSearchRequest" : {
"travelDate" : 20151206,
"travelDuration" : 7,
"shopperDuration" : 30,
"oneWay" : false,
"userId" : "ATP6CXS",
"queryId" : "71a09900-1c13",
"subRequests" : [{
"origin" : "WAS",
"destination" : "LON",
"carrier" : "AF",
"fareClasses" : "",
"owrt" : "1,2"
}, {
"origin" : "WAS",
"destination" : "LON",
"carrier" : "AA",
"fareClasses" : "",
"owrt" : "1,2"
}, {
"origin" : "WAS",
"destination" : "LON",
"carrier" : "DL",
"fareClasses" : "",
"owrt" : "1,2"
}, {
"origin" : "WAS",
"destination" : "LON",
"carrier" : "LH",
"fareClasses" : "",
"owrt" : "1,2"
}, {
"origin" : "WAS",
"destination" : "LON",
"carrier" : "BA",
"fareClasses" : "",
"owrt" : "1,2"
}]
},
"downloadCount" : 0,
"requestDate" : 20151205,
"totalRecords" : 6941,
"status" : "SUCCESS"
}
/* 7 */
{
"_id" : "a036a42a-918b",
"uiSearchRequest" : {
"travelDate" : 20151206,
"travelDuration" : 7,
"shopperDuration" : 30,
"oneWay" : false,
"userId" : "ATP1MMM",
"queryId" : "a036a42a-918b",
"subRequests" : [{
"origin" : "WAS",
"destination" : "LON",
"carrier" : "AA",
"fareClasses" : "",
"owrt" : "1,2"
}]
},
"downloadCount" : 0,
"requestDate" : 20151205,
"totalRecords" : 1388,
"status" : "SUCCESS"
}
/* 8 */
{
"_id" : "c547be36-805c",
"uiSearchRequest" : {
"travelDate" : 20151206,
"travelDuration" : 7,
"shopperDuration" : 30,
"oneWay" : false,
"userId" : "ATP1SXB",
"queryId" : "c547be36-805c",
"subRequests" : [{
"origin" : "CHI",
"destination" : "LON",
"carrier" : "BA",
"fareClasses" : "",
"owrt" : "1,2"
}]
},
"downloadCount" : 2,
"requestDate" : 20151205,
"totalRecords" : 1072,
"status" : "SUCCESS"
}
Mon code est ci-dessous (Bien que je ne l'ai pas bien loin):
library(jsonlite)
library(RJSONIO)
json_data_raw<-fromJSON("mydata.txt")
json_file <- lapply(json_data_raw, function(x) {
x[sapply(x, is.null)] <- NA
unlist(x)
})
output <-- do.call("rbind", json_file)
write.csv(a, file="json.csv",row.names = FALSE)
file.show("json.csv")
Que j'essaie de faire ma sortie dans un fichier CSV comme ci-dessous
Exactement comment voulez-vous réduire cette structure imbriquée rectangulaire fichier CSV? Quel est précisément la sortie? Vous devez inclure les données de l'échantillon dans la question elle-même pour le problème reproductible. Photos de données ne sont pas très utiles.
merci pour la suggestion. J'ai apporté les modifications.
fromJSON(grep('/\\*.*\\*/', readLines(mydata.txt), invert = TRUE, value = TRUE))
se débarrasser des lignes de commentaires, mais ne parvient toujours pas pour moi.merci pour la suggestion. J'ai apporté les modifications.
OriginalL'auteur Lester Pereira | 2016-06-23
Vous devez vous connecter pour publier un commentaire.
Il ya plusieurs problèmes avec votre fichier texte. Comme vous l'avez déjà remarqué, vous devez supprimer les lignes de la forme
/* 0 */
. Quels sont les résultats n'est toujours pas valide json. Si vous souhaitez avoir plusieurs objets json dans un fichier, vous devez les stocker dans un tableau. Les objets json sont les pièces qui sont fermés entre paranthèses, par exemple,La structure d'un tableau d'objets est comme suit:
Pour obtenir votre fichier dans la forme, vous avez besoin d'ajouter une virgule entre les objets et les ajouter les crochets. Vous pouvez le faire comme suit:
Il peut être lu par
fromJSON()
, donc je suppose que c'est valable json:La table imbriquée, qui est, certains de la tables de cellules contient une trame de données ou une liste eux-mêmes. Par exemple,
Vous pouvez utiliser
flatten()
de lajsonlite
paquet, pour obtenir un tableau avec un niveau d'imbrication moinsLa dernière colonne est toujours une liste. Il existe de nombreuses façons que vous pouvez soulever. Une possibilité est de créer une ligne par une sous-requête, où le contenu de toutes les autres colonnes (
X_id
,downloadCount
, etc.) sont répétées. (C'est presque la forme que vous donnez à votre question, avec la seule différence que vous avez laissé les cellules vides dans la reapeated colonnes, tandis que je répète le contenu.) C'est la façon dont il peut être fait:La deuxième ligne permet de créer une liste de trames de données. Ceux-ci sont combinés dans un seul bloc de données à l'aide de
bind_rows()
dedpylr
. (Pour être plus précis,flat_table
sera untbl_df
, mais la différence d'undata.frame
est petit). Ce peut être écrite dans un fichier csv dans la manière habituelle:Le résultat de
flatten(table)
peut en effet pas être écrites dans un fichier csv avecwrite.csv()
, car cette fonction ne peut pas faire face avec le fait que l'une des colonnes de la trame de données est une liste de. J'ai ajouté un peu plus de lignes de code qui assurez-vous que vous avez vraiment obtenir un seul bloc de données qui peuvent être écrits dans un fichier csv.Je ne suis pas familier avec le message d'erreur en vous commentaire. Depuis, il mentionne Java, je suppose que vous utilisez un package pour créer des fichiers Excel. Donc, vous avez probablement un problème avec la façon dont vous utilisez ce package. Peut-être que le problème est aussi la liste qui est contenue dans le bloc de données et le problème va disparaître, une fois que vous utiliser le code supplémentaire que j'ai fournie. Si non, vous devez demander une nouvelle question spécifique à propos de votre problème lors de la création de fichier Excel (après que vous avez effectué une recherche AFIN de vérifier si la question a déjà été posée, bien sûr...)
Quand je lance tab_list <- lapply(1:nrow(tableau), la fonction(i) des données.cadre(tableau[i, -12], tableau[i, 12], stringsAsFactors = FALSE)) j'obtiens l'erreur suivante: une Erreur dans les données.cadre(tableau[i, -12], tableau[i, 12], stringsAsFactors = FALSE) : arguments impliquent différents nombre de lignes: 1, 0
Eh bien, apparemment
table <- fromJSON(json)
ne fonctionne pas parce que vous avez eu un message d'erreur, que tu n'aurais pas eu avectable <- flatten(fromJSON(json))
. Le code dans ma réponse donne le même résultat que votre modification (à l'exception de la colonne des noms et l'ordre des lignes), mais il est beaucoup plus simple.OriginalL'auteur Stibu