मैं आर सीखने की कोशिश कर रहा हूं और मेरे पास सिंगल लाइन जेएसओएन ऑब्जेक्ट्स से भरा एक 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 उत्तर
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