R语言处理/读取带有JSON数据字段的csv文件/JSON文件

读取JSON文件(后缀为.json)

这个相对比较简单,R或者Java都可以轻松处理,下两个json相关的包就可以了

install.packages("rjson")
install.packages("jsonlite")
library(rjson)
library(jsonlite)

data = jsonlite::stream_in(file("jsondatafile1.json"),pagesize = 100)
str(data)
head(data)

读取带有JSON数据/字段的csv文件

带有JSON数据/字段的csv文件,即以csv格式储存,但一部分列/字段是普通的数据格式,另一部分列/字段是JSON数据格式。

文件示例
time以及event列都是常见的数据格式,但 params 列是JSON格式
time以及event列都是常见的数据格式,但 params 列是JSON格式

这种文件处理起来相对麻烦,因为是csv文件,所以不能直接用读取json文件的函数或者包,只能先当作csv文件读取然后再单独处理相关json字段

但可以放心的是,实际上处理耗时跟使用Java处理json文件差不多,所以不用担心效率问题,也不用费时费劲去找Java的方法(当然,这是建立在不熟悉Java的情况下,如果会Java的话会比较简单)

JSON字段示例
假设以下是 user 列的数据示范
{"_idfa":"","_idfv_end":"",“ip_addr_id”:“0”,“open_udid”:“2askjchajscuashcnjf”,“uid”:“asjchajschashcks”,“user_is_login”:“0”,“web_id”:“0”}

下面是处理上述JSON字段的方法

## 先把 user 列的原始数据单独取出来
user_raw = as.list(raw_data$user)
class(user_raw)

# 手动创建JSON数据中每列的名称(注意,每个JSON数据的数据列数可能会小于这类JSON数据的总列数)
# 输入json字段里的字段名称时可能会比较耗时也有点无聊,但用Java处理的时候一样是要手动输入的,并不是方法的锅
user_start = data.frame('idfa' = NA,
                        'idfv' = NA,
                        'ip_addr_id' = NA,
                        'open_udid' = NA,
                        'uid' = NA,
                        'user_is_login' = NA,
                        'web_id' = NA)
user_end = user_start

# 100 不是固定值,只是原csv文件的行数
for (i in 1:100){
  # 把每个单独字段分割开
  user_split1 = strsplit(user_raw[[i]],',')
  # 准备一个临时表,用来存放这一个JSON数据的所有字段
  tmp_df = user_start
  for (j in seq(1,length(user_split1[[1]]))){
  	# 第二次分割,把字段名称和内容分割出来
    tmp = strsplit(user_split1[[1]][j],':')
    # 处理列名中的各种特殊符号
    col_name_raw = tmp[[1]][1]
    col_name_clean = gsub('[{]', '', col_name_raw)
    col_name_clean = gsub('["]', '', col_name_clean)
    # 处理以下划线开头的名称
    first_letter = substring(col_name_clean,1,1)
    if (first_letter == "_") {
      col_name_clean = substring(col_name_clean,2,nchar(col_name_clean))
    }
    # 取出内容
    data = tmp[[1]][2]
    # 去掉双引号是为了方便之后转换格式,因为有可能需要转成numeric格式来计算 
    data_clean = gsub('["]', '', data)
  
    pos = which(colnames(tmp_df) == col_name_clean)
    
    tmp_df[1,pos] = data_clean
  }
  user_end = rbind(user_end, tmp_df)
}

# 最后处理一下最后一列data最后的花括号,以及初始的NA
user_end = user_end[-1,]
user_end$web_id = gsub('[}]', '', user_end$web_id)

# 检查数据格式并转换
#class(user_end$web_id)
#user_end$web_id = as.numeric(user_end$web_id) 
#class(user_end$web_id)

这样就读取完了一个JSON列的所有数据,如果有多个JSON列的话只需要改改变量名就可以读取了,最后把JSON列的dataframe和原本的dataframe合并一下就可以进行后续分析了

Java读取JSON字段的方法

可参考
https://www.jianshu.com/p/6096e6740ac9

你可能感兴趣的:(R,数据分析)