gpt4 book ai didi

python - 寻找 DSL 将 JSON 转换为 CSV

转载 作者:太空宇宙 更新时间:2023-11-03 19:17:01 27 4
gpt4 key购买 nike

我需要将分层数据(AVRO 数据,归结为 JSON)转换为表格数据 (csv)。由于 AVRO 具有严格的架构,我基本上知道 JSON 将采用什么形式,但我必须对许多不同的架构执行此操作,因此我正在寻找一种一致的声明性方式来表达我需要进行的转换。例如,如果我的传入数据如下所示......

{
"customers": [
{
"addresses": [
{
"city": "Los Angeles",
"country": "USA",
"county": null,
"postalCode": "90064",
"stateOrProvince": "California",
"street1": "11832 W. Pico Blvd.",
"street2": "",
"street3": "",
"street4": "",
"tags": [
"BILLING"
]
}
],
"company": "",
"dateCreated": "2009-04-24T11:42:31+00:00",
"dateOfBirth": null,
"doNotCall": null,
"email": {
"emailAddress": "general@magentocommerce.com"
},
"emailOptOut": null,
"fullName": {
"firstName": "Test",
"lastName": "General",
"middleName": "",
"prefix": "",
"suffix": ""
},
"gender": null,
"id": {
"Id": "2",
"namespace": "1000020016"
},
"lastModified": "2009-05-08T23:33:06+00:00",
"primaryPhone": {
"number": "866.4.VARIEN",
"type": "UNKNOWN"
},
"sourceIds": null
}
],
"totalItemsFound": 3
}

…我可能需要为每个客户输出一行,如下所示:

MERCHANT ID|NUM CUSTOMERS|ID|FIRST NAME|LAST NAME|EMAIL|PHONE|STREET|CITY|STATE|ZIP|COUNTRY|EMAIL PREFERENCE
some.merch|3|1000020016-2|Test|General|general@magentocommerce.com|866.4.VARIEN|11832 W. Pico Blvd.|Los Angeles|California|90064|USA|N

我需要能够表达以下内容:

  1. 以数组形式获取给定键的所有值:所有出生日期
  2. 在每一行重复一个值:totalItemsFound,在每一行重复
  3. 在来 self 已知的静态数据的每一行中重复一个静态值商家 channel 永远不会改变
  4. 还有一个棘手的问题:任意操作传入的数据以产生所需的输出:
    • 将客户 ID 转换为命名空间 ID
    • 将 null/ bool 值反转并更改为 y/n,如 emailOptOut 更改为 EMAIL PREFERENCE
    • (重新)格式化日期或货币
    • 等等

我从 jsonpath 开始,但这只能解决上面的#1。我一直在慢慢地围绕 jsonpath 添加一种语言来服务 2 和 3,但我真的没有一个关于 4 的好的答案(除了 eval 之外,我真的很讨厌这样做)。我看了JSON/T ,但找不到它的Python库。我什至认真考虑过编写一个中间件来将 JSON 转换为 XML,以便我可以使用 XSLT,但我希望在我陷入绝望之前,S/O 的某人能有更好的解决方案。

最佳答案

为什么不尝试进行功能分解,如下所示:

w = csv.writer(...)
for r in records:
l = {}
for field in fields:
f_ = rename(field)
v_ = transform(field, r.get(field, default(field)))
l[f_] = v_
w.write(l)

其中 rename 将旧字段名称映射到新字段名称,transform 根据字段的转换集转换字段的值,default 返回要分配给该字段的值。

因此,您只需要定义字段列表和函数:renametransformdefault

对于您给出的示例:

def rename(field):
t = {'emailOptOut':'EMAIL PREFERENCE'}
return t.get(field, field)

def transform(field, data):
t = {'emailOptOut': bool}
return t.get(field, lambda a: a)(data)

def default(field)
t = {'MERCHANT ID':11039215}
return t.get(field, None)

关于python - 寻找 DSL 将 JSON 转换为 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11039215/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com