PHP实现MySQL多行单记录转一行多列并导出CSV
解决MySQL键值对表转分组CSV的问题
看起来你需要把键值对格式的用户属性表转换成按用户分组的单行格式,然后导出为CSV。针对你60万行的数据集,我给你两种实用高效的方案:
方案一:直接用MySQL查询生成目标格式再导出
这种方案最省心,不用额外写脚本,利用MySQL的GROUP_CONCAT函数就能完成分组拼接。
假设你的表名为user_attrs,三个字段分别是record_id(第一列自增ID)、user_id(第二列用户标识)、attr_value(第三列属性值),执行以下SQL就能得到你想要的格式:
-- 先调整GROUP_CONCAT最大长度(如果用户属性较多,默认1024可能不够) SET SESSION group_concat_max_len = 1000000; SELECT CONCAT(user_id, '|', GROUP_CONCAT(attr_value SEPARATOR '|')) AS formatted_row FROM user_attrs GROUP BY user_id ORDER BY user_id;
导出为CSV文件
用MySQL命令行工具直接导出查询结果:
# 替换为你的用户名、数据库名 mysql -u your_user -p --batch --raw -e "SET SESSION group_concat_max_len = 1000000; SELECT CONCAT(user_id, '|', GROUP_CONCAT(attr_value SEPARATOR '|')) FROM user_attrs GROUP BY user_id ORDER BY user_id;" your_db_name > formatted_output.csv
--batch和--raw参数确保输出无额外格式(比如表头、边框),直接是纯文本行。- 导出的
formatted_output.csv每行就是你要的格式:1|John|Smith|Green|Car、2|Jane|Doe|Blue|Bike...
方案二:导出原始数据后用Python脚本处理
如果数据有特殊情况(比如属性值包含|符号,或者需要更灵活的逻辑),可以先导出原始数据,再用脚本转换:
1. 导出原始数据
mysql -u your_user -p --batch --raw -e "SELECT * FROM user_attrs;" your_db_name > raw_data.csv
2. Python处理脚本
这个脚本会按user_id分组,把同一用户的所有属性值拼接成一行:
import csv from collections import defaultdict # 初始化字典存储每个用户的属性 user_attr_map = defaultdict(list) # 读取原始数据 with open('raw_data.csv', 'r', encoding='utf-8') as raw_file: # 按|分割每行数据 reader = csv.reader(raw_file, delimiter='|') for row in reader: # 确保每行有至少3列数据 if len(row) >= 3: user_id = row[1] attr_val = row[2] user_attr_map[user_id].append(attr_val) # 写入格式化后的CSV with open('final_output.csv', 'w', encoding='utf-8', newline='') as final_file: writer = csv.writer(final_file, delimiter='|') # 按user_id排序输出 for user_id in sorted(user_attr_map.keys(), key=int): output_row = [user_id] + user_attr_map[user_id] writer.writerow(output_row)
运行脚本后,final_output.csv就是你需要的目标格式。
额外提示
- 如果属性值里包含
|,要提前替换成其他符号(比如^),否则会破坏CSV的分隔逻辑。 - 60万行数据用Python处理完全没问题,脚本是逐行读取的,内存占用很低。
内容的提问来源于stack exchange,提问作者Meitos
相关产品推荐
相关产品推荐

