【问题标题】:How can I convert JSON (from google-trends-api) to CSV?如何将 JSON(从 google-trends-api)转换为 CSV?
【发布时间】:2018-10-02 22:11:07
【问题描述】:

我一直在尝试使用来自 npmjs.com 的 javascript google-trends-api 来自动检索搜索趋势数据。我成功地从我的查询中获取了原始 JSON 输出,但我似乎无法成功地将它们解析成一种形式——最好是 CSV 或制表符分隔的文本——我可以将其导入其他软件 (Stata) 进行分析.我尝试使用 json2csv 来解析结果,但这不会返回类似于电子表格样式文件的内容。

以下是一些具有代表性的查询结果示例(长度有所删减):

"{\"default\":{\"geoMapData\":[{\"geoCode\":\"798\",\"geoName\":\"Glendive MT\",\"value\" :[100],\"formattedValue\":[\"100\"],\"maxValueIndex\":0,\"hasData\":[true]},{\"geoCode\":\"552\" ,\"geoName\":\"Presque Isle ME\",\"value\":[49],\"formattedValue\":[\"49\"],\"maxValueIndex\":0,\"hasData \":[true]},{\"geoCode\":\"710\",\"geoName\":\"Hattiesburg-Laurel MS\",\"value\":[11],\"formattedValue\ ":[\"11\"],\"maxValueIndex\":0,\"hasData\":[true]},{\"geoCode\":\"766\",\"geoName\":\"海伦娜 MT\",\"value\":[0],\"formattedValue\":[\"\"],\"maxValueIndex\":0,\"hasData\":[false]}]}}"

在运行 json2csv -i "results.json" 并使用 fs.outputJson 保存输出时,除非我去掉最外层的引号和所有反斜杠,否则会出错。但即使这样做了,这就是我得到的回报:

"default.geoMapData" "[{""geoCode"":""798"",""geoName"":""Glendive MT"",""value"":[100],""formattedValue"":[""100"" ],""maxValueIndex"":0,""hasData"":[true]},{""geoCode"":""552"",""geoName"":""Presque Isle ME"",""值"":[49],""formattedValue"":[""49""],""maxValueIndex"":0,""hasData"":[true]},{""geoCode"":"" 710"",""geoName"":""哈蒂斯堡-月桂树 MS"",""value"":[11],""formattedValue"":[""11""],""maxValueIndex"":0 ,""hasData"":[true]},{""geoCode"":""766"",""geoName"":""Helena MT"",""value"":[0],"" formattedValue"":[""""],""maxValueIndex"":0,""hasData"":[false]}]"

对于如何将我的查询输出转换为合理的 CSV(或类似格式)提供任何指导,我将不胜感激。我应该补充一点,我是这方面的初学者,如果答案很明显,我深表歉意!

埃里克

【问题讨论】:

    标签: javascript json parsing google-trends json2csv


    【解决方案1】:

    要将 JSON 数据转换为 CSV,您可以使用jq 命令行实用程序。

    提供你的样本数据,你可以这样做:

    echo "{\"default\":{\"geoMapData\":[{\"geoCode\":\"798\",\"geoName\":\"Glendive MT\",\"value\":[100],\"formattedValue\":[\"100\"],\"maxValueIndex\":0,\"hasData\":[true]},{\"geoCode\":\"552\",\"geoName\":\"Presque Isle ME\",\"value\":[49],\"formattedValue\":[\"49\"],\"maxValueIndex\":0,\"hasData\":[true]},{\"geoCode\":\"710\",\"geoName\":\"Hattiesburg-Laurel MS\",\"value\":[11],\"formattedValue\":[\"11\"],\"maxValueIndex\":0,\"hasData\":[true]},{\"geoCode\":\"766\",\"geoName\":\"Helena MT\",\"value\":[0],\"formattedValue\":[\"\"],\"maxValueIndex\":0,\"hasData\":[false]}]}}" | \
    jq -r '.default.geoMapData | map([.geoCode,.geoName,(.value[]|tostring),.formattedValue[],(.maxValueIndex|tostring),(.hasData[]|tostring)] | join(",")) | join("\n")'
    798,Glendive MT,100,100,0,true
    552,Presque Isle ME,49,49,0,true
    710,Hattiesburg-Laurel MS,11,11,0,true
    766,Helena MT,0,,0,false
    

    【讨论】:

    • 谢谢奥利夫——这对我有用!由于对转换文件感兴趣,我把代码改成了:cat results.json | jq -r '.default.geoMapData | map([.geoCode,.geoName,(.value[]|tostring),.formattedValue[],(.maxValueIndex|tostring),(.hasData[]|tostring)] | join(",")) | join("\n")' > parsed.csv 不过或许还有更高效的方法?
    • 您的意思可能是这样的:jq '...' result.json > parsed.csv。顺便说一句,不要忘记查看this
    • 起初这很完美......但现在我遇到了一个错误。 (我不知道发生了什么变化,但确实发生了一些变化!)现在,当我使用 jq '.default.geoMapData | map([.geoCode,.geoName,(.value[]|tostring),.formattedValue[],(.maxValueIndex|tostring),(.hasData[]|tostring)] | join(",")) | join("\n")' result.json > parsed.csv 时,我收到错误 jq: error (at result.json:0): Cannot index string with string "default"。当我使用您第一次建议的echo 版本时,一切顺利。但是当我从文件中读取时,我得到了那个错误!回显文本和 result.json 的内容是一致的。
    • 问题是由echo 解释但不是cat 解释的反斜杠引用的字符串。要解决这个问题,请尝试sed 's/^"//;s/\\//g;s/"$//' result.json | jq '...' > parse.csv
    • 显然这会更好地了解result.json是如何创建并在那里解决的。
    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多