You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R语言中将CSV转换为分层对象数组格式的JSON

CSV转分层JSON实现思路

需求说明

将指定结构的CSV文件转换为按ew_id分层的JSON格式:每个唯一ew_id对应一个对象数组,同时将fil1至fil5列合并为fillers数组字段。

输入CSV示例

sub_numcons_rsus_rsusfil1fil2fil3fil4fil5perpew_id
147W1577760673276891
55B21771111481451131411931
NAR153711255081872
NAR21501241201571781641882

期望输出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)

关键注意事项

  1. 数据类型转换:CSV读取的所有值默认是字符串,需将数字类型字段(如ew_id、sus_r)转为整数。
  2. NA值处理:通过na_filter=False保留原始"NA"字符串,若需转为JSON的null,可在转换时判断替换。
  3. 分组逻辑:通过字典或Pandas的groupby实现按ew_id聚合,确保同一ew_id的记录归为一个数组。

内容的提问来源于stack exchange,提问作者dumbPsychologist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:21:08