在R语言中将CSV转换为分层对象数组格式的JSON
CSV转分层JSON实现思路
需求说明
将指定结构的CSV文件转换为按ew_id分层的JSON格式:每个唯一ew_id对应一个对象数组,同时将fil1至fil5列合并为fillers数组字段。
输入CSV示例
| sub_num | cons_r | sus_r | sus | fil1 | fil2 | fil3 | fil4 | fil5 | perp | ew_id |
|---|---|---|---|---|---|---|---|---|---|---|
| 147 | W | 1 | 57 | 77 | 60 | 67 | 32 | 76 | 89 | 1 |
| 55 | B | 2 | 177 | 111 | 148 | 145 | 113 | 141 | 193 | 1 |
| NA | R | 1 | 53 | 7 | 11 | 25 | 50 | 81 | 87 | 2 |
| NA | R | 2 | 150 | 124 | 120 | 157 | 178 | 164 | 188 | 2 |
期望输出JSON格式
let exp_info = [ [ {"ew_id": 1, "sub_num": 147, "cons_r": "W", "sus_r": 1, "sus": 57, "fillers": [77,60,67,32,76], "perp":89 }, {"ew_id":1, "sub_num":55, "cons_r": "B", "sus_r": 2, "sus": 177, "fillers": [111,148,145,113,141], "perp":193 } ], [ {"ew_id": 2, "sub_num": "NA", "cons_r": "R", "sus_r": 1, "sus": 53, "fillers": [7,11,25,50,81], "perp":87 }, {"ew_id":2, "sub_num":"NA", "cons_r": "R", "sus_r": 2, "sus": 150, "fillers": [124,120,157,178,164], "perp":188 } ] ];
实现思路(Python示例)
方法一:使用Pandas(简洁高效)
Pandas适合快速处理表格数据,分组操作非常便捷:
import pandas as pd import json # 读取CSV,保留原始"NA"字符串不转为NaN df = pd.read_csv('your_file.csv', na_filter=False) # 定义行转换函数,将单条CSV记录转为目标格式的字典 def transform_row(row): return { "ew_id": int(row['ew_id']), "sub_num": row['sub_num'], "cons_r": row['cons_r'], "sus_r": int(row['sus_r']), "sus": int(row['sus']), "fillers": [int(row[f'fil{i}']) for i in range(1,6)], "perp": int(row['perp']) } # 按ew_id分组,每组转换为对象列表,最终转为数组格式 grouped_data = df.groupby('ew_id').apply( lambda group: [transform_row(row) for _, row in group.iterrows()] ).tolist() # 生成JavaScript变量格式的输出 js_result = f"let exp_info = {json.dumps(grouped_data, indent=2)};" print(js_result)
方法二:使用原生CSV模块(无依赖)
如果不想引入第三方库,用Python标准库即可实现:
import csv import json # 初始化分组字典,key为ew_id,value为对应对象数组 grouped_dict = {} with open('your_file.csv', 'r', newline='') as csv_file: reader = csv.DictReader(csv_file) for row in reader: # 合并fil1-fil5为fillers数组 fillers = [int(row[f'fil{i}']) for i in range(1,6)] # 构建单条记录的字典 record = { "ew_id": int(row['ew_id']), "sub_num": row['sub_num'], "cons_r": row['cons_r'], "sus_r": int(row['sus_r']), "sus": int(row['sus']), "fillers": fillers, "perp": int(row['perp']) } # 按ew_id分组存储 ew_id = row['ew_id'] if ew_id not in grouped_dict: grouped_dict[ew_id] = [] grouped_dict[ew_id].append(record) # 将分组字典的值转为数组,得到目标结构 exp_info = list(grouped_dict.values()) # 输出JavaScript格式结果 js_result = f"let exp_info = {json.dumps(exp_info, indent=2)};" print(js_result)
关键注意事项
- 数据类型转换:CSV读取的所有值默认是字符串,需将数字类型字段(如
ew_id、sus_r)转为整数。 - NA值处理:通过
na_filter=False保留原始"NA"字符串,若需转为JSON的null,可在转换时判断替换。 - 分组逻辑:通过字典或Pandas的
groupby实现按ew_id聚合,确保同一ew_id的记录归为一个数组。
内容的提问来源于stack exchange,提问作者dumbPsychologist
相关产品推荐
相关产品推荐

