Отредактируйте список файлов json, указав имя файла файлов json в R

#r #json

#r #json

Вопрос:

Я использую R. У меня есть группа файлов json, подобных этому:

файл1.json файл2.json файл3.json

Каждый файл имеет одинаковую структуру с несколькими событиями внутри, организованными следующим образом

 {
    "id": MEME1,
    "created_at": 55796,
    "text": "patatipatata",
    "Perso": {
        "id": "MEMEuk",      
},

{
    "id": MEME2,
    "created_at": 55795,
    "text": "lolme",
    "Perso": {
        "id": "MEMEfr",
        
}
 

Я хотел бы отредактировать каждый файл json с именем исходного файла для каждого события, подобного этому для file1.json и других

 {
    "file_name": file1.json,
    "id": MEME,
    "created_at": 55796,
    "text": "patatipatata",
    "Perso": {
        "id": "MEMEuk",
        

},
{
    "file_name": file1.json,        
    "id": MEME2,
    "created_at": 55795,
    "text": "lolme",
    "Perso": {
        "id": "MEMEfr",
        
}
 

Я не очень хорошо знаком со структурой json и редакцией json с R.
Конечная цель — объединить и сгладить группу файлов json и получить вектор с именем исходного файла для каждого события. Эта последняя часть меня устраивает.

Спасибо за вашу помощь.

Комментарии:

1. Эти файлы не являются допустимыми json ( MEME1 должны быть заключены в кавычки, встроенный словарь не закрыт, а список должен быть заключен в квадратные скобки [ / ] ). Безопасно ли это исправить, или ваши файлы действительно недействительны и должны оставаться такими?

Ответ №1:

Эти файлы являются недопустимыми файлами json по нескольким причинам. Я исправлю ошибки, чтобы они правильно анализировались.

  • file1.json
     [{
        "id": "MEME1",
        "created_at": 55796,
        "text": "patatipatata",
        "Perso": {
            "id": "MEMEuk"
        }
    },
    {
        "id": "MEME2",
        "created_at": 55795,
        "text": "lolme",
        "Perso": {
            "id": "MEMEfr"
        }
    }]
     
  • file2.json (упрощенный)
     [{
        "id": "MEME3",
        "created_at": 55796
    },
    {
        "id": "MEME2",
        "created_at": 55795
    }]
     

Прочитайте их в:

 files <- list.files(pattern = "\.json$", full.names = TRUE)
files
# [1] "./file1.json" "./file2.json"
alldat <- lapply(setNames(nm = files), jsonlite::read_json)

str(alldat[[2]]) # files[2], aka 'file2.json'
# List of 2
#  $ :List of 2
#   ..$ id        : chr "MEME3"
#   ..$ created_at: int 55796
#  $ :List of 2
#   ..$ id        : chr "MEME2"
#   ..$ created_at: int 55795
 

Вставка имени файла

 alldat2 <- Map(function(nm, onedat) {
  lapply(onedat, function(x) {
    x$file_name <- nm
    x
  })
}, names(alldat), alldat)

str(alldat2[[2]])
# List of 2
#  $ :List of 3
#   ..$ id        : chr "MEME3"
#   ..$ created_at: int 55796
#   ..$ file_name : chr "./file2.json"
#  $ :List of 3
#   ..$ id        : chr "MEME2"
#   ..$ created_at: int 55795
#   ..$ file_name : chr "./file2.json"
 

Запишите обратно в файл

 Map(function(onedat, fn) jsonlite::write_json(onedat, fn, pretty = TRUE, auto_unbox = TRUE),
    alldat2, files)
# 
 #r #json

 #r #json

Вопрос:

Я использую R. У меня есть группа файлов json, подобных этому: файл1.json файл2.json файл3.json Каждый файл имеет одинаковую структуру с несколькими событиями внутри, организованными следующим образом
 {
    "id": MEME1,
    "created_at": 55796,
    "text": "patatipatata",
    "Perso": {
        "id": "MEMEuk",      
},

{
    "id": MEME2,
    "created_at": 55795,
    "text": "lolme",
    "Perso": {
        "id": "MEMEfr",
        
}
 

Я хотел бы отредактировать каждый файл json с именем исходного файла для каждого события, подобного этому для file1.json и других

 {
    "file_name": file1.json,
    "id": MEME,
    "created_at": 55796,
    "text": "patatipatata",
    "Perso": {
        "id": "MEMEuk",
        

},
{
    "file_name": file1.json,        
    "id": MEME2,
    "created_at": 55795,
    "text": "lolme",
    "Perso": {
        "id": "MEMEfr",
        
}
 

Я не очень хорошо знаком со структурой json и редакцией json с R.
Конечная цель - объединить и сгладить группу файлов json и получить вектор с именем исходного файла для каждого события. Эта последняя часть меня устраивает.

Спасибо за вашу помощь.

Комментарии:

1. Эти файлы не являются допустимыми json ( MEME1 должны быть заключены в кавычки, встроенный словарь не закрыт, а список должен быть заключен в квадратные скобки [ / ] ). Безопасно ли это исправить, или ваши файлы действительно недействительны и должны оставаться такими?

Ответ №1:

Эти файлы являются недопустимыми файлами json по нескольким причинам. Я исправлю ошибки, чтобы они правильно анализировались.

  • file1.json
     [{
        "id": "MEME1",
        "created_at": 55796,
        "text": "patatipatata",
        "Perso": {
            "id": "MEMEuk"
        }
    },
    {
        "id": "MEME2",
        "created_at": 55795,
        "text": "lolme",
        "Perso": {
            "id": "MEMEfr"
        }
    }]
     
  • file2.json (упрощенный)
     [{
        "id": "MEME3",
        "created_at": 55796
    },
    {
        "id": "MEME2",
        "created_at": 55795
    }]
     

Прочитайте их в:

 files <- list.files(pattern = "\.json$", full.names = TRUE)
files
# [1] "./file1.json" "./file2.json"
alldat <- lapply(setNames(nm = files), jsonlite::read_json)

str(alldat[[2]]) # files[2], aka 'file2.json'
# List of 2
#  $ :List of 2
#   ..$ id        : chr "MEME3"
#   ..$ created_at: int 55796
#  $ :List of 2
#   ..$ id        : chr "MEME2"
#   ..$ created_at: int 55795
 

Вставка имени файла

 alldat2 <- Map(function(nm, onedat) {
  lapply(onedat, function(x) {
    x$file_name <- nm
    x
  })
}, names(alldat), alldat)

str(alldat2[[2]])
# List of 2
#  $ :List of 3
#   ..$ id        : chr "MEME3"
#   ..$ created_at: int 55796
#   ..$ file_name : chr "./file2.json"
#  $ :List of 3
#   ..$ id        : chr "MEME2"
#   ..$ created_at: int 55795
#   ..$ file_name : chr "./file2.json"
 

Запишите обратно в файл

./file1.json`
# NULL
#

#r #json

#r #json

Вопрос:

Я использую R. У меня есть группа файлов json, подобных этому:

файл1.json файл2.json файл3.json

Каждый файл имеет одинаковую структуру с несколькими событиями внутри, организованными следующим образом

 {
    "id": MEME1,
    "created_at": 55796,
    "text": "patatipatata",
    "Perso": {
        "id": "MEMEuk",      
},

{
    "id": MEME2,
    "created_at": 55795,
    "text": "lolme",
    "Perso": {
        "id": "MEMEfr",
        
}
 

Я хотел бы отредактировать каждый файл json с именем исходного файла для каждого события, подобного этому для file1.json и других

 {
    "file_name": file1.json,
    "id": MEME,
    "created_at": 55796,
    "text": "patatipatata",
    "Perso": {
        "id": "MEMEuk",
        

},
{
    "file_name": file1.json,        
    "id": MEME2,
    "created_at": 55795,
    "text": "lolme",
    "Perso": {
        "id": "MEMEfr",
        
}
 

Я не очень хорошо знаком со структурой json и редакцией json с R.
Конечная цель - объединить и сгладить группу файлов json и получить вектор с именем исходного файла для каждого события. Эта последняя часть меня устраивает.

Спасибо за вашу помощь.

Комментарии:

1. Эти файлы не являются допустимыми json ( MEME1 должны быть заключены в кавычки, встроенный словарь не закрыт, а список должен быть заключен в квадратные скобки [ / ] ). Безопасно ли это исправить, или ваши файлы действительно недействительны и должны оставаться такими?

Ответ №1:

Эти файлы являются недопустимыми файлами json по нескольким причинам. Я исправлю ошибки, чтобы они правильно анализировались.

  • file1.json
     [{
        "id": "MEME1",
        "created_at": 55796,
        "text": "patatipatata",
        "Perso": {
            "id": "MEMEuk"
        }
    },
    {
        "id": "MEME2",
        "created_at": 55795,
        "text": "lolme",
        "Perso": {
            "id": "MEMEfr"
        }
    }]
     
  • file2.json (упрощенный)
     [{
        "id": "MEME3",
        "created_at": 55796
    },
    {
        "id": "MEME2",
        "created_at": 55795
    }]
     

Прочитайте их в:

 files <- list.files(pattern = "\.json$", full.names = TRUE)
files
# [1] "./file1.json" "./file2.json"
alldat <- lapply(setNames(nm = files), jsonlite::read_json)

str(alldat[[2]]) # files[2], aka 'file2.json'
# List of 2
#  $ :List of 2
#   ..$ id        : chr "MEME3"
#   ..$ created_at: int 55796
#  $ :List of 2
#   ..$ id        : chr "MEME2"
#   ..$ created_at: int 55795
 

Вставка имени файла

 alldat2 <- Map(function(nm, onedat) {
  lapply(onedat, function(x) {
    x$file_name <- nm
    x
  })
}, names(alldat), alldat)

str(alldat2[[2]])
# List of 2
#  $ :List of 3
#   ..$ id        : chr "MEME3"
#   ..$ created_at: int 55796
#   ..$ file_name : chr "./file2.json"
#  $ :List of 3
#   ..$ id        : chr "MEME2"
#   ..$ created_at: int 55795
#   ..$ file_name : chr "./file2.json"
 

Запишите обратно в файл

./file2.json`
# NULL

readLines(files[2])
# [1] "["
# [2] " {"
# [3] " "id": "MEME3","
# [4] " "created_at": 55796,"
# [5] " "file_name": "./file2.json""
# [6] " },"
# [7] " {"
# [8] " "id": "MEME2","
# [9] " "created_at": 55795,"
# [10] " "file_name": "./file2.json""
# [11] " }"
# [12] "]"

Возможно, не гарантируется, что они выглядят точно так же, как до чтения, хотя структура (и разборчивость json) должны быть в порядке.

Комментарии:

1. Это работало для меня до тех пор, пока часть не вставила имя файла и не создала файл alldat2. Затем json изменился, и его нелегко сгладить, но мне удалось это сделать. Спасибо r2evans.