मैं आर सीखने की कोशिश कर रहा हूं और मेरे पास सिंगल लाइन जेएसओएन ऑब्जेक्ट्स से भरा एक JSON फ़ाइल है, और प्रत्येक ऑब्जेक्ट में खाता डेटा की एक सरणी है। मैं जो करने की कोशिश कर रहा हूं वह प्रत्येक पंक्ति को पार्स करता है, फिर JSON सरणी को पार्स किए गए JSON ऑब्जेक्ट से प्राप्त करें, खाता प्रकार और राशि खींचें। लेकिन मेरी समस्या यह है कि मुझे नहीं पता कि केवल उन दो विशेषताओं को कैसे निकालना है।

मैंने अपनी प्रत्येक JSON लाइनों में से "accountHistory" को खींचने के लिए dplyr पैकेज का उपयोग करने का प्रयास किया है, लेकिन मुझे कंसोल त्रुटि मिलती है। जब मैं कोशिश करता हूं:

select(JsonAcctData, "accountHistory.type", "accountHistory.amount")

क्या होता है, मेरा कोड केवल प्रत्येक पंक्ति के प्रकार और राशि के लिए अंतिम खाता लौटाता है।

अभी मेरा कोड एक सीएसवी फ़ाइल में लिख रहा है और मैं अपनी जरूरत का सारा डेटा देख सकता हूं, लेकिन मैं सिर्फ एक्सटी को हटाना चाहता हूं

library("rjson")
library("dplyr")

parseJsonData <- function (sourceFile, outputFile) 
{
  #Get all total lines in the source file provided
  totalLines <- readLines(sourceFile)

  #Clean up old output file
  if(file.exists(outputFile)){
    file.remove(outputFile)
  }

  #Loop over each line in the sourceFile, 
  #parse the JSON and append to DataFrame
  JsonAcctData <- NULL
  for(i in 1:length(totalLines)){
    jsonValue <- fromJSON(totalLines[[i]])
    frame <- data.frame(jsonValue)
    JsonAcctData <- rbind(JsonAcctData, frame)
  }

  #Try to get filtered data
  filteredColumns <- 
    select(JsonAcctData, "accountHistory.type", "accountHistory.amount")
  print(filteredColumns)

  #Write the DataFrame to the output file in CSV format
  write.csv(JsonAcctData, file = outputFile)

}

परीक्षण JSON फ़ाइल डेटा:

{"name":"Test1", "accountHistory":[{"amount":"107.62","date":"2012-02- 
  02T06:00:00.000Z","business":"CompanyA","name":"Home Loan Account 
  6220","type":"payment","account":"11111111"}, 
  {"amount":"650.88","date":"2012-02- 
  02T06:00:00.000Z","business":"CompanyF","name":"Checking Account 
  9001","type":"payment","account":"123123123"}, 
  {"amount":"878.63","date":"2012-02- 
  02T06:00:00.000Z","business":"CompanyG","name":"Money Market Account 
  8743","type":"deposit","account":"123123123"}]}
  {"name":"Test2", "accountHistory":[{"amount":"199.29","date":"2012-02-            
  02T06:00:00.000Z","business":"CompanyB","name":"Savings Account 
  3580","type":"invoice","account":"12312312"}, 
  {"amount":"841.48","date":"2012-02- 
  02T06:00:00.000Z","business":"Company","name":"Home Loan Account 
  5988","type":"payment","account":"123123123"}, 
  {"amount":"116.55","date":"2012-02- 
  02T06:00:00.000Z","business":"Company","name":"Auto Loan Account 
  1794","type":"withdrawal","account":"12312313"}]}

मैं एक सीएसवी प्राप्त करने की अपेक्षा करता हूं जिसमें केवल खाता प्रकार और प्रत्येक खाते में रखी गई राशियां हों।

1
CGideon 18 जिंदा 2019, 00:01

1 उत्तर

सबसे बढ़िया उत्तर

regex (base R में) का उपयोग करने का एक तरीका यहां दिया गया है

# read json 
json <- readLines('test.json', warn = FALSE)
# extract with regex
amount <- grep('\"amount\":\"\\d+\\.\\d+\"', json, value = TRUE)
amount <- as.numeric(gsub('.*amount\":\"(\\d+\\.+\\d+)\".*', '\\1', amount, perl = TRUE))
type   <- grep('\"type\":\"\\w+\"', json, value = TRUE)
type   <- gsub('.*type\":\"(\\w+)\".*', '\\1', type, perl = TRUE)
# output
data.frame(type, amount)
#         type amount
# 1    payment 107.62
# 2    payment 650.88
# 3    deposit 878.63
# 4    invoice 199.29
# 5    payment 841.48
# 6 withdrawal 116.55
1
niko 18 जिंदा 2019, 00:23