Преобразование файла JSON в файл SQLite - PullRequest
0 голосов
/ 15 апреля 2020

Я пишу функцию для преобразования файла JSON в файл SQLite, представляя его в таблице, но у меня небольшие проблемы с индексацией объектов без ключей. Например, я конвертирую этот JSON файл, но не уверен, как правильно его проиндексировать.

[ [ "A1", "A2", "A3" ],
  [ 1.1, 2.2, 3.3],
  [ 4.4, 5.5, 6.6] ]

Пока это все, что у меня есть

library(rjson)
library(sqldf)
library(RSQLite)

convert = function (infile,outfile,name = "test"){
  data = fromJSON(file = infile)
  cols = length(data$header) #data[1]
  rows = length(data$data) #data[2]
  temp = matrix(NA, rows, cols) #create an empty dataframe and populate it

  for (i in 1:rows){
    for (j in 1:cols){
      temp[i,j] = ((data$data)[[i]])[[j]]
    }
  }

  #Save data into the dataframe
  temp = as.data.frame(temp)
  colnames(temp) = data$header

  #Save to sqlite
  db = dbConnect(SQLite(), dbname = outfile)
  dbWriteTable(conn = db, name = name, value = result, row.names = FALSE, overwrite = TRUE)

}

infile - это JSON файл, содержащий список. Первый элемент списка - это список строк, определяющих имена столбцов. Последующие элементы списка представляют собой списки числовых значений. outfile - это база данных SQLite с таблицей, представляющей данные в infile, с 3 столбцами A1 A2 A3.

1 Ответ

1 голос
/ 15 апреля 2020

Преобразование из JSON в кадр немного более прямолинейно, чем у вас:

infile <- '
[ [ "A1", "A2", "A3" ],
  [ 1.1, 2.2, 3.3],
  [ 4.4, 5.5, 6.6] ]'

convert <- function(infile, outfile, name = "test") {
  dat <- jsonlite::fromJSON(infile)
  colnames(dat) <- dat[1,]
  dat <- as.data.frame(dat[-1,], stringsAsFactors = FALSE)
  con <- DBI::dbConnect(RSQLite::SQLite(), outfile)
  on.exit({ DBI::dbDisconnect(con) }, add = TRUE)
  DBI::dbWriteTable(con, name, dat, row.names = FALSE, overwrite = TRUE)
  return(dat)
}
convert(infile, "~/Downloads/quux.sqlite")
#    A1  A2  A3
# 1 1.1 2.2 3.3
# 2 4.4 5.5 6.6

con <- DBI::dbConnect(RSQLite::SQLite(), "~/Downloads/quux.sqlite")
str(DBI::dbGetQuery(con, "select * from test"))
# 'data.frame': 2 obs. of  3 variables:
#  $ A1: chr  "1.1" "4.4"
#  $ A2: chr  "2.2" "5.5"
#  $ A3: chr  "3.3" "6.6"

(я сделал str, чтобы продемонстрировать, что он вставлен буквально; если вам нужно преобразовать до numeric, это еще один простой шаг.)

Я использовал для этого jsonlite, я считаю (без проверки), что он будет работать аналогично с rjson.

...