Mixpanel ProductDetails事件数据转CSV异常,求正确转换方案
解决Mixpanel ProductDetails事件转CSV的表头错误与数据缺失问题
你遇到的问题核心在于每个properties里的特殊键——它是字符串格式的键值对集合,而非字典类型,原代码里的isinstance(value, dict)判断完全没触发,导致ProductName、ProductId、source这些关键数据被当成了混乱的表头,值还为空,最终引发表头错误和数据缺失。
解决方案
我们需要单独解析这个特殊字符串键,提取里面的字段并合并到扁平化数据中,同时移除无用的长键。具体实现如下:
import csv import re # 解析特殊格式的字符串键,提取键值对 def parse_special_key(key_str): cleaned = key_str.strip('{}') # 正则匹配键值对,兼容值中包含空格的情况 pairs = re.findall(r'(\w+)=([^,]+)(?:,|$)', cleaned) return {key.strip(): value.strip() for key, value in pairs} # 扁平化处理原始数据 flattened_data = [] for item in data: properties = item['properties'] flattened_item = {} for key, value in properties.items(): # 识别并处理特殊格式的键 if key.startswith('{') and key.endswith('}'): parsed_fields = parse_special_key(key) flattened_item.update(parsed_fields) else: flattened_item[key] = value flattened_data.append(flattened_item) # 提取并排序所有表头,保证输出顺序稳定 column_names = sorted({key for item in flattened_data for key in item.keys()}) # 写入CSV文件,指定UTF-8编码避免乱码 with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=column_names) writer.writeheader() writer.writerows(flattened_data)
代码说明
parse_special_key函数通过正则匹配,精准提取特殊字符串中的ProductName、ProductId、source字段,兼容值中包含空格的场景- 遍历属性时直接识别特殊键并解析,将有效字段合并到扁平化对象,不再保留原始的长键
- 表头用
sorted排序,保证CSV输出的表头顺序稳定 - 添加
encoding='utf-8'参数,避免中文或特殊字符出现乱码
运行后,CSV表头会包含所有有效字段(包括原本隐藏的ProductName、ProductId、source),所有数据完整填充,不会再出现混乱表头和数据缺失的问题。
内容的提问来源于stack exchange,提问作者Gojoe
相关产品推荐
相关产品推荐

