如何用jq将JSON转换为CSV?解决数组索引报错问题
解决Open-Meteo API JSON转CSV的jq错误问题
尝试用jq将Open-Meteo API返回的JSON转换为指定CSV时,遇到错误:error (at <stdin>:0): Cannot index array with string "time"。以下是相关信息及解决方案:
JSON数据示例
{ "latitude": 52.52, "longitude": 13.419998, "generationtime_ms": 0.23293495178222656, "utc_offset_seconds": 7200, "timezone": "Europe/Berlin", "timezone_abbreviation": "CEST", "elevation": 38.0, "daily_units": { "time": "iso8601", "weather_code": "wmo code", "temperature_2m_max": "°F", "temperature_2m_min": "°F", "precipitation_probability_max": "%" }, "daily": { "time": [ "2024-10-13", "2024-10-14" ], "weather_code": [ 80, 61 ], "temperature_2m_max": [ 52.7, 53.1 ], "temperature_2m_min": [ 48.6, 43.7 ], "precipitation_probability_max": [ 100, 10 ] } }
期望CSV格式
time,weather_code,temperature_2m_max,temperature_2m_min,precipitation_probability_max 2024-10-13,80,52.7,48.6,100 2024-10-14,61,53.1,43.7,10
当前使用的命令
curl -s "https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41&daily=weather_code,temperature_2m_max,temperature_2m_min,precipitation_probability_max&temperature_unit=fahrenheit&wind_speed_unit=mph&precipitation_unit=inch&timezone=auto&forecast_days=14" | jq -r ' [ "date", "weather_code", "temperature_2m_max", "temperature_2m_min", "precipitation_probability_max" ], .daily | [ .time[], .weather_code[], .temperature_2m_max[], .temperature_2m_min[], .precipitation_probability_max[] ] | @csv '
错误原因
当前命令的核心问题是处理.daily数据的逻辑错误:直接将各个字段的数组元素平铺成一个一维数组,而非按日期对应生成每行数据。这种结构会导致jq无法正确解析字段关联关系,进而抛出索引错误。另外表头的date与期望的time不匹配。
修正后的命令
curl -s "https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41&daily=weather_code,temperature_2m_max,temperature_2m_min,precipitation_probability_max&temperature_unit=fahrenheit&wind_speed_unit=mph&precipitation_unit=inch&timezone=auto&forecast_days=14" | jq -r ' ["time", "weather_code", "temperature_2m_max", "temperature_2m_min", "precipitation_probability_max"] | @csv, .daily | [.time, .weather_code, .temperature_2m_max, .temperature_2m_min, .precipitation_probability_max] | transpose[] | @csv '
命令说明
- 先输出匹配期望格式的表头,通过
@csv转为CSV格式。 - 将
.daily下需要的字段数组放入一个二维数组,用transpose转置数组——把原本按字段分组的结构转为按日期分组的结构,每个子数组对应一行数据。 - 遍历转置后的每个子数组,用
@csv转为CSV行,最终得到符合要求的输出。
内容的提问来源于stack exchange,提问作者featherlessbiped
相关产品推荐
相关产品推荐

