{"id":"7563c817-0990-48b5-8587-b35f3d92045e","shortId":"HYnMH4","kind":"skill","title":"json-and-csv-data-transformation","tagline":"Transform data between JSON, CSV, and other formats with filtering, mapping, and flattening. Use when: (1) Converting API responses to CSV, (2) Processing data pipelines, (3) Extracting specific fields, or (4) Flattening nested structures.","description":"# JSON and CSV Data Transformation\n\nTransform data between JSON, CSV, and other formats. Filter, map, flatten nested objects, and reshape data for analysis, reporting, and API integration.\n\n## When to use\n\n- Use case 1: When the user asks to convert data between JSON and CSV formats\n- Use case 2: When you need to filter, extract, or transform specific fields from data\n- Use case 3: For flattening nested JSON structures into tabular format\n- Use case 4: When processing API responses for analysis or reporting\n\n## Required tools / APIs\n\n- **jq** — Command-line JSON processor (essential for JSON manipulation)\n- **csvkit** — Suite of CSV tools (csvjson, csvcut, csvgrep, etc.)\n- No external API required\n\nInstall options:\n\n```bash\n# Ubuntu/Debian\nsudo apt-get install -y jq csvkit\n\n# macOS\nbrew install jq csvkit\n\n# Node.js (native support, no packages needed for basic operations)\n# For advanced CSV parsing: npm install csv-parse csv-stringify\n```\n\n## Skills\n\n### json_to_csv\n\nConvert JSON array to CSV format.\n\n```bash\n# Simple JSON array to CSV\necho '[{\"name\":\"Alice\",\"age\":30},{\"name\":\"Bob\",\"age\":25}]' | jq -r '(.[0] | keys_unsorted) as $keys | $keys, (map([.[ $keys[] ]]) | .[] | @csv)'\n\n# JSON file to CSV file\njq -r '(.[0] | keys_unsorted) as $keys | $keys, (map([.[ $keys[] ]]) | .[] | @csv)' data.json > output.csv\n\n# JSON to CSV with specific fields\njq -r '.[] | [.id, .name, .email] | @csv' users.json\n\n# Using csvkit (simpler syntax)\ncat data.json | in2csv -f json > output.csv\n```\n\n**Node.js:**\n\n```javascript\nfunction jsonToCSV(jsonArray) {\n  if (!Array.isArray(jsonArray) || jsonArray.length === 0) {\n    return '';\n  }\n  \n  // Get headers from first object\n  const headers = Object.keys(jsonArray[0]);\n  \n  // Escape CSV values\n  const escape = (val) => {\n    if (val === null || val === undefined) return '';\n    const str = String(val);\n    if (str.includes(',') || str.includes('\"') || str.includes('\\n')) {\n      return `\"${str.replace(/\"/g, '\"\"')}\"`;\n    }\n    return str;\n  };\n  \n  // Build CSV\n  const headerRow = headers.join(',');\n  const dataRows = jsonArray.map(obj =>\n    headers.map(header => escape(obj[header])).join(',')\n  );\n  \n  return [headerRow, ...dataRows].join('\\n');\n}\n\n// Usage\n// const data = [\n//   { name: 'Alice', age: 30, city: 'New York' },\n//   { name: 'Bob', age: 25, city: 'San Francisco' }\n// ];\n// console.log(jsonToCSV(data));\n```\n\n### csv_to_json\n\nConvert CSV to JSON array.\n\n```bash\n# CSV to JSON\ncsvjson data.csv\n\n# CSV to JSON with pretty printing\ncsvjson data.csv | jq '.'\n\n# CSV to JSON array of objects\ncsvjson --stream data.csv\n\n# CSV file to JSON file\ncsvjson input.csv > output.json\n\n# Using pure jq (if headers are in first row)\njq -Rsn '[inputs | split(\",\") | {name: .[0], age: .[1], city: .[2]}]' < data.csv\n```\n\n**Node.js:**\n\n```javascript\nfunction csvToJSON(csvString) {\n  const lines = csvString.trim().split('\\n');\n  if (lines.length < 2) return [];\n  \n  // Parse CSV value (handle quotes)\n  const parseCSVValue = (val) => {\n    val = val.trim();\n    if (val.startsWith('\"') && val.endsWith('\"')) {\n      return val.slice(1, -1).replace(/\"\"/g, '\"');\n    }\n    return val;\n  };\n  \n  // Split CSV line (basic implementation)\n  const splitCSVLine = (line) => {\n    const result = [];\n    let current = '';\n    let inQuotes = false;\n    \n    for (let i = 0; i < line.length; i++) {\n      const char = line[i];\n      \n      if (char === '\"') {\n        inQuotes = !inQuotes;\n        current += char;\n      } else if (char === ',' && !inQuotes) {\n        result.push(parseCSVValue(current));\n        current = '';\n      } else {\n        current += char;\n      }\n    }\n    result.push(parseCSVValue(current));\n    return result;\n  };\n  \n  const headers = splitCSVLine(lines[0]);\n  const data = lines.slice(1).map(line => {\n    const values = splitCSVLine(line);\n    const obj = {};\n    headers.forEach((header, i) => {\n      obj[header] = values[i] || '';\n    });\n    return obj;\n  });\n  \n  return data;\n}\n\n// Usage\n// const csv = `name,age,city\n// Alice,30,New York\n// Bob,25,\"San Francisco\"`;\n// console.log(JSON.stringify(csvToJSON(csv), null, 2));\n```\n\n### filter_and_extract_json\n\nFilter and extract specific fields from JSON.\n\n```bash\n# Extract specific fields\njq '.[] | {name: .name, email: .email}' users.json\n\n# Filter by condition\njq '.[] | select(.age > 25)' users.json\n\n# Filter and extract\njq '[.[] | select(.active == true) | {id: .id, name: .name}]' data.json\n\n# Extract nested fields\njq '.[] | {name: .name, street: .address.street, city: .address.city}' data.json\n\n# Get array of single field\njq '.[].name' users.json\n\n# Filter with multiple conditions\njq '.[] | select(.age > 20 and .country == \"USA\")' users.json\n\n# Map and transform values\njq '.[] | .price = (.price * 1.1)' products.json\n```\n\n**Node.js:**\n\n```javascript\nfunction filterAndExtractJSON(data, options) {\n  const { filter, extract } = options;\n  \n  let result = Array.isArray(data) ? data : [data];\n  \n  // Apply filter function\n  if (filter) {\n    result = result.filter(filter);\n  }\n  \n  // Extract specific fields\n  if (extract) {\n    result = result.map(item => {\n      const extracted = {};\n      extract.forEach(field => {\n        // Support nested fields with dot notation\n        const value = field.split('.').reduce((obj, key) => obj?.[key], item);\n        extracted[field] = value;\n      });\n      return extracted;\n    });\n  }\n  \n  return result;\n}\n\n// Usage\n// const users = [\n//   { id: 1, name: 'Alice', age: 30, address: { city: 'NYC' } },\n//   { id: 2, name: 'Bob', age: 25, address: { city: 'SF' } },\n//   { id: 3, name: 'Charlie', age: 35, address: { city: 'LA' } }\n// ];\n// \n// const result = filterAndExtractJSON(users, {\n//   filter: user => user.age > 25,\n//   extract: ['name', 'age', 'address.city']\n// });\n// console.log(result);\n```\n\n### flatten_nested_json\n\nFlatten nested JSON objects into flat structure.\n\n```bash\n# Flatten nested JSON with jq\njq '[.[] | {id: .id, name: .name, street: .address.street, city: .address.city, zip: .address.zip}]' users.json\n\n# Flatten all nested fields with custom separator\njq '[.[] | to_entries | map({key: .key, value: .value}) | from_entries]' data.json\n\n# Flatten deeply nested structure\njq 'recurse | select(type != \"object\" and type != \"array\")' complex.json\n```\n\n**Node.js:**\n\n```javascript\nfunction flattenJSON(obj, prefix = '', separator = '.') {\n  const flattened = {};\n  \n  for (const key in obj) {\n    const value = obj[key];\n    const newKey = prefix ? `${prefix}${separator}${key}` : key;\n    \n    if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n      // Recursively flatten nested objects\n      Object.assign(flattened, flattenJSON(value, newKey, separator));\n    } else if (Array.isArray(value)) {\n      // Convert arrays to string or flatten each item\n      flattened[newKey] = JSON.stringify(value);\n    } else {\n      flattened[newKey] = value;\n    }\n  }\n  \n  return flattened;\n}\n\n// Usage\n// const nested = {\n//   id: 1,\n//   name: 'Alice',\n//   address: {\n//     street: '123 Main St',\n//     city: 'NYC',\n//     coordinates: { lat: 40.7, lon: -74.0 }\n//   },\n//   tags: ['user', 'active']\n// };\n// console.log(flattenJSON(nested));\n// Output: {\n//   id: 1,\n//   name: 'Alice',\n//   'address.street': '123 Main St',\n//   'address.city': 'NYC',\n//   'address.coordinates.lat': 40.7,\n//   'address.coordinates.lon': -74.0,\n//   tags: '[\"user\",\"active\"]'\n// }\n```\n\n### transform_csv_data\n\nTransform and manipulate CSV data.\n\n```bash\n# Select specific columns\ncsvcut -c name,email,age users.csv\n\n# Filter rows by value\ncsvgrep -c age -r \"^[3-9][0-9]$\" users.csv  # age >= 30\n\n# Sort CSV\ncsvsort -c age -r users.csv  # reverse sort by age\n\n# Remove duplicate rows\ncsvcut -c name,email users.csv | uniq\n\n# Combine: filter, select columns, sort\ncsvgrep -c country -m \"USA\" users.csv | csvcut -c name,age | csvsort -c age\n\n# Add calculated column (requires csvpy or awk)\nawk -F',' 'BEGIN{OFS=\",\"} NR==1{print $0,\"total\"} NR>1{print $0,$2*$3}' data.csv\n\n# Merge two CSV files by column\ncsvjoin -c id users.csv orders.csv\n```\n\n**Node.js:**\n\n```javascript\nfunction transformCSV(csvData, transformations) {\n  const { selectColumns, filterRows, sortBy } = transformations;\n  \n  // Parse CSV to objects\n  const data = csvToJSON(csvData);\n  \n  let result = data;\n  \n  // Filter rows\n  if (filterRows) {\n    result = result.filter(filterRows);\n  }\n  \n  // Select columns\n  if (selectColumns) {\n    result = result.map(row => {\n      const selected = {};\n      selectColumns.forEach(col => {\n        selected[col] = row[col];\n      });\n      return selected;\n    });\n  }\n  \n  // Sort\n  if (sortBy) {\n    const { column, reverse } = sortBy;\n    result.sort((a, b) => {\n      const aVal = a[column];\n      const bVal = b[column];\n      const comparison = aVal > bVal ? 1 : aVal < bVal ? -1 : 0;\n      return reverse ? -comparison : comparison;\n    });\n  }\n  \n  // Convert back to CSV\n  return jsonToCSV(result);\n}\n\n// Usage\n// const csv = `name,age,country\n// Alice,30,USA\n// Bob,25,Canada\n// Charlie,35,USA`;\n//\n// const transformed = transformCSV(csv, {\n//   filterRows: row => row.country === 'USA',\n//   selectColumns: ['name', 'age'],\n//   sortBy: { column: 'age', reverse: true }\n// });\n// console.log(transformed);\n```\n\n### aggregate_and_group_json\n\nAggregate and group JSON data (similar to SQL GROUP BY).\n\n```bash\n# Group by field and count\njq 'group_by(.country) | map({country: .[0].country, count: length})' users.json\n\n# Sum values by group\njq 'group_by(.category) | map({category: .[0].category, total: map(.price) | add})' products.json\n\n# Average by group\njq 'group_by(.department) | map({department: .[0].department, avg_salary: (map(.salary) | add / length)})' employees.json\n\n# Multiple aggregations\njq 'group_by(.region) | map({\n  region: .[0].region,\n  count: length,\n  total_sales: map(.sales) | add,\n  avg_sales: (map(.sales) | add / length)\n})' sales.json\n```\n\n**Node.js:**\n\n```javascript\nfunction groupAndAggregate(data, groupBy, aggregations) {\n  // Group data\n  const grouped = {};\n  data.forEach(item => {\n    const key = item[groupBy];\n    if (!grouped[key]) grouped[key] = [];\n    grouped[key].push(item);\n  });\n  \n  // Apply aggregations\n  return Object.entries(grouped).map(([key, items]) => {\n    const result = { [groupBy]: key };\n    \n    aggregations.forEach(agg => {\n      if (agg.type === 'count') {\n        result[agg.name] = items.length;\n      } else if (agg.type === 'sum') {\n        result[agg.name] = items.reduce((sum, item) => sum + (item[agg.field] || 0), 0);\n      } else if (agg.type === 'avg') {\n        const sum = items.reduce((s, item) => s + (item[agg.field] || 0), 0);\n        result[agg.name] = items.length > 0 ? sum / items.length : 0;\n      } else if (agg.type === 'min') {\n        result[agg.name] = Math.min(...items.map(item => item[agg.field] || Infinity));\n      } else if (agg.type === 'max') {\n        result[agg.name] = Math.max(...items.map(item => item[agg.field] || -Infinity));\n      }\n    });\n    \n    return result;\n  });\n}\n\n// Usage\n// const sales = [\n//   { region: 'East', product: 'A', amount: 100 },\n//   { region: 'East', product: 'B', amount: 200 },\n//   { region: 'West', product: 'A', amount: 150 },\n//   { region: 'West', product: 'B', amount: 250 }\n// ];\n//\n// const result = groupAndAggregate(sales, 'region', [\n//   { name: 'count', type: 'count' },\n//   { name: 'total_amount', type: 'sum', field: 'amount' },\n//   { name: 'avg_amount', type: 'avg', field: 'amount' }\n// ]);\n// console.log(result);\n```\n\n## Rate limits / Best practices\n\n- ✅ **Stream large files** — Use jq with `-c` flag and process line by line for large datasets\n- ✅ **Validate data** — Check JSON/CSV format before transformation\n- ✅ **Handle missing fields** — Use default values for null/undefined fields\n- ✅ **Memory management** — For files >100MB, use streaming parsers\n- ✅ **Type conversion** — Be aware of number/string conversions in CSV\n- ✅ **Preserve data types** — JSON maintains types, CSV converts everything to strings\n- ⚠️ **Character encoding** — Ensure UTF-8 encoding for international characters\n- ⚠️ **Quote escaping** — Properly escape quotes in CSV values\n\n## Agent prompt\n\n```text\nYou have JSON and CSV data transformation capability. When a user asks to transform data:\n\n1. Identify the input format:\n   - JSON: Look for {...} or [...]\n   - CSV: Look for comma-separated values with headers\n\n2. For JSON to CSV:\n   - Use jq with @csv filter: `jq -r '... | @csv'`\n   - Or csvkit: `in2csv -f json`\n   - Node.js: Convert array of objects to CSV string\n\n3. For CSV to JSON:\n   - Use csvjson from csvkit: `csvjson file.csv`\n   - Node.js: Parse CSV headers and data rows into objects\n\n4. For filtering/extracting:\n   - Use jq select(): `jq '.[] | select(.age > 25)'`\n   - Use csvkit csvgrep: `csvgrep -c column -m value`\n   - Node.js: Use Array.filter() and map()\n\n5. For flattening:\n   - Flatten nested JSON objects into dot notation\n   - Convert nested structures to tabular format\n   - Handle arrays by stringifying or creating separate rows\n\n6. For aggregation:\n   - Use jq group_by(): `jq 'group_by(.field) | map({...})'`\n   - CSV: Convert to JSON, aggregate, convert back\n   - Node.js: Implement grouping and aggregation functions\n\nAlways:\n- Preserve data integrity (no data loss)\n- Handle edge cases (empty values, special characters)\n- Validate output format matches expected structure\n- For large files (>100MB), recommend streaming approaches\n```\n\n## Troubleshooting\n\n**Error: \"parse error: Invalid numeric literal\"**\n- Symptom: jq fails to parse JSON\n- Solution: Validate JSON format with `jq empty file.json`, fix syntax errors\n\n**CSV columns not aligned:**\n- Symptom: Data appears in wrong columns after transformation\n- Solution: Check for unescaped commas in data, ensure quotes are properly escaped\n\n**Empty output from jq:**\n- Symptom: jq returns no results\n- Solution: Check filter expression syntax, verify data structure matches filter\n\n**Special characters broken in CSV:**\n- Symptom: Non-ASCII characters appear garbled\n- Solution: Ensure UTF-8 encoding: `iconv -f UTF-8 -t UTF-8 file.csv`\n\n**Memory error with large files:**\n- Symptom: Process runs out of memory\n- Solution: Use streaming mode: `jq -c` or Node.js streams for line-by-line processing\n\n**JSON doesn't convert to flat CSV:**\n- Symptom: Nested objects create complex CSV structure\n- Solution: Flatten JSON first before converting to CSV\n\n## See also\n\n- [../database-query-and-export/SKILL.md](../database-query-and-export/SKILL.md) — Export database results as JSON/CSV\n- [../web-search-api/SKILL.md](../web-search-api/SKILL.md) — Transform API responses to desired format\n- [../using-web-scraping/SKILL.md](../using-web-scraping/SKILL.md) — Process scraped data into structured formats","tags":["json","and","csv","data","transformation","open","skills","besoeasy","agent-skills","ai-agents","claude-code","clawdbot"],"capabilities":["skill","source-besoeasy","skill-json-and-csv-data-transformation","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-clawdbot","topic-clawdbot-skill","topic-llm-tools","topic-mcp-server","topic-openai","topic-openclaw","topic-vibe-coding","topic-vibecoding"],"categories":["open-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/besoeasy/open-skills/json-and-csv-data-transformation","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add besoeasy/open-skills","source_repo":"https://github.com/besoeasy/open-skills","install_from":"skills.sh"}},"qualityScore":"0.505","qualityRationale":"deterministic score 0.51 from registry signals: · indexed on github topic:agent-skills · 111 github stars · SKILL.md body (14,790 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T12:55:04.068Z","embedding":null,"createdAt":"2026-04-18T22:10:48.064Z","updatedAt":"2026-05-02T12:55:04.068Z","lastSeenAt":"2026-05-02T12:55:04.068Z","tsv":"'-1':441,1068 '-74.0':867,888 '-8':1431,1707,1712,1715 '-9':919,921 '/database-query-and-export/skill.md':1767,1768 '/g':308,443 '/using-web-scraping/skill.md':1782,1783 '/web-search-api/skill.md':1774,1775 '0':214,230,273,284,405,464,498,920,977,982,1069,1140,1155,1171,1188,1262,1263,1276,1277,1281,1284 '1':22,73,407,440,502,685,853,876,975,980,1065,1462 '1.1':621 '100':1319 '100mb':1403,1621 '123':858,880 '150':1331 '2':28,88,409,423,541,694,983,1480 '20':609 '200':1325 '25':211,344,533,569,698,718,1091,1535 '250':1337 '3':32,103,703,918,984,1506 '30':207,337,529,689,924,1088 '35':707,1094 '4':37,114,1526 '40.7':865,886 '5':1549 '6':1573 'activ':576,870,891 'add':963,1160,1177,1196,1201 'address':690,699,708,856 'address.city':592,722,749,883 'address.coordinates.lat':885 'address.coordinates.lon':887 'address.street':590,747,879 'address.zip':751 'advanc':176 'age':206,210,336,343,406,526,568,608,688,697,706,721,908,916,923,929,935,959,962,1085,1106,1109,1534 'agent':1444 'agg':1243 'agg.field':1261,1275,1295,1307 'agg.name':1248,1255,1279,1290,1302 'agg.type':1245,1252,1266,1287,1299 'aggreg':1114,1118,1181,1210,1231,1575,1589,1596 'aggregations.foreach':1242 'alic':205,335,528,687,855,878,1087 'align':1652 'also':1766 'alway':1598 'amount':1318,1324,1330,1336,1349,1353,1356,1360 'analysi':63,120 'api':24,66,117,125,147,1777 'appear':1655,1702 'appli':639,1230 'approach':1624 'apt':155 'apt-get':154 'array':193,200,358,377,595,782,832,1500,1566 'array.filter':1546 'array.isarray':270,635,815,829 'ascii':1700 'ask':77,1458 'aval':1054,1063,1066 'averag':1162 'avg':1173,1197,1267,1355,1358 'awar':1410 'awk':969,970 'b':1052,1059,1323,1335 'back':1075,1591 'bash':151,197,359,553,735,900,1128 'basic':173,449 'begin':972 'best':1365 'bob':209,342,532,696,1090 'brew':162 'broken':1694 'build':311 'bval':1058,1064,1067 'c':905,915,928,940,951,957,961,993,1373,1540,1733 'calcul':964 'canada':1092 'capabl':1454 'case':72,87,102,113,1607 'cat':258 'categori':1152,1154,1156 'char':469,473,477,480,488 'charact':1427,1435,1611,1693,1701 'charli':705,1093 'check':1385,1662,1683 'citi':338,345,408,527,591,691,700,709,748,861 'col':1036,1038,1040 'column':903,948,965,991,1027,1047,1056,1060,1108,1541,1650,1658 'combin':945 'comma':1475,1665 'comma-separ':1474 'command':128 'command-lin':127 'comparison':1062,1072,1073 'complex':1754 'complex.json':783 'condit':565,605 'console.log':348,536,723,871,1112,1361 'const':280,288,297,313,316,332,416,430,451,454,468,494,499,505,509,523,629,655,665,682,711,791,794,798,802,850,1003,1012,1033,1046,1053,1057,1061,1082,1096,1213,1217,1238,1268,1312,1338 'convers':1408,1413 'convert':23,79,191,354,831,1074,1423,1499,1559,1586,1590,1746,1762 'coordin':863 'count':1133,1142,1190,1246,1344,1346 'countri':611,952,1086,1137,1139,1141 'creat':1570,1753 'csv':4,11,27,43,50,84,139,177,182,185,190,195,202,222,226,238,243,252,286,312,351,355,360,365,374,383,426,447,524,539,893,898,926,988,1009,1077,1083,1099,1415,1422,1442,1451,1471,1484,1488,1492,1504,1508,1519,1585,1649,1696,1749,1755,1764 'csv-pars':181 'csv-stringifi':184 'csvcut':142,904,939,956 'csvdata':1001,1015 'csvgrep':143,914,950,1538,1539 'csvjoin':992 'csvjson':141,363,371,380,388,1512,1515 'csvkit':136,160,165,255,1494,1514,1537 'csvpi':967 'csvsort':927,960 'csvstring':415 'csvstring.trim':418 'csvtojson':414,538,1014 'current':457,476,484,485,487,491 'custom':758 'data':5,8,30,44,47,61,80,100,333,350,500,521,627,636,637,638,894,899,1013,1018,1122,1208,1212,1384,1417,1452,1461,1522,1600,1603,1654,1667,1688,1786 'data.csv':364,372,382,410,985 'data.foreach':1215 'data.json':239,259,582,593,770 'databas':1770 'datarow':317,328 'dataset':1382 'deepli':772 'default':1394 'depart':1168,1170,1172 'desir':1780 'doesn':1744 'dot':663,1557 'duplic':937 'east':1315,1321 'echo':203 'edg':1606 'els':478,486,827,843,1250,1264,1285,1297 'email':251,560,561,907,942 'employees.json':1179 'empti':1608,1644,1673 'encod':1428,1432,1708 'ensur':1429,1668,1705 'entri':762,769 'error':1626,1628,1648,1718 'escap':285,289,322,1437,1439,1672 'essenti':132 'etc':144 'everyth':1424 'expect':1616 'export':1769 'express':1685 'extern':146 'extract':33,94,544,548,554,573,583,631,647,651,656,674,678,719 'extract.foreach':657 'f':261,971,1496,1710 'fail':1634 'fals':460 'field':35,98,246,550,556,585,598,649,658,661,675,756,1131,1352,1359,1392,1398,1583 'field.split':667 'file':224,227,384,387,989,1369,1402,1620,1721 'file.csv':1516,1716 'file.json':1645 'filter':16,54,93,542,546,563,571,602,630,640,643,646,715,910,946,1019,1489,1684,1691 'filterandextractjson':626,713 'filtering/extracting':1528 'filterrow':1005,1022,1025,1100 'first':278,398,1760 'fix':1646 'flag':1374 'flat':733,1748 'flatten':19,38,56,105,725,728,736,753,771,792,818,822,836,839,844,848,1551,1552,1758 'flattenjson':787,823,872 'format':14,53,85,111,196,1387,1466,1564,1614,1641,1781,1789 'francisco':347,535 'function':266,413,625,641,786,999,1206,1597 'garbl':1703 'get':156,275,594 'group':1116,1120,1126,1129,1135,1148,1150,1164,1166,1183,1211,1214,1222,1224,1226,1234,1578,1581,1594 'groupandaggreg':1207,1340 'groupbi':1209,1220,1240 'handl':428,1390,1565,1605 'header':276,281,321,324,395,495,512,515,1479,1520 'headerrow':314,327 'headers.foreach':511 'headers.join':315 'headers.map':320 'iconv':1709 'id':249,578,579,684,693,702,742,743,852,875,994 'identifi':1463 'implement':450,1593 'in2csv':260,1495 'infin':1296,1308 'input':402,1465 'input.csv':389 'inquot':459,474,475,481 'instal':149,157,163,180 'integr':67,1601 'intern':1434 'invalid':1629 'item':654,673,838,1216,1219,1229,1237,1258,1260,1272,1274,1293,1294,1305,1306 'items.length':1249,1280,1283 'items.map':1292,1304 'items.reduce':1256,1270 'javascript':265,412,624,785,998,1205 'join':325,329 'jq':126,159,164,212,228,247,373,393,400,557,566,574,586,599,606,618,740,741,760,775,1134,1149,1165,1182,1371,1486,1490,1530,1532,1577,1580,1633,1643,1676,1678,1732 'json':2,10,41,49,82,107,130,134,188,192,199,223,241,262,353,357,362,367,376,386,545,552,727,730,738,1117,1121,1419,1449,1467,1482,1497,1510,1554,1588,1637,1640,1743,1759 'json-and-csv-data-transform':1 'json.stringify':537,841 'json/csv':1386,1773 'jsonarray':268,271,283 'jsonarray.length':272 'jsonarray.map':318 'jsontocsv':267,349,1079 'key':215,218,219,221,231,234,235,237,670,672,764,765,795,801,807,808,1218,1223,1225,1227,1236,1241 'la':710 'larg':1368,1381,1619,1720 'lat':864 'length':1143,1178,1191,1202 'let':456,458,462,633,1016 'limit':1364 'line':129,417,448,453,470,497,504,508,1377,1379,1739,1741 'line-by-lin':1738 'line.length':466 'lines.length':422 'lines.slice':501 'liter':1631 'lon':866 'look':1468,1472 'loss':1604 'm':953,1542 'maco':161 'main':859,881 'maintain':1420 'manag':1400 'manipul':135,897 'map':17,55,220,236,503,614,763,1138,1153,1158,1169,1175,1186,1194,1199,1235,1548,1584 'match':1615,1690 'math.max':1303 'math.min':1291 'max':1300 'memori':1399,1717,1727 'merg':986 'min':1288 'miss':1391 'mode':1731 'multipl':604,1180 'n':305,330,420 'name':204,208,250,334,341,404,525,558,559,580,581,587,588,600,686,695,704,720,744,745,854,877,906,941,958,1084,1105,1343,1347,1354 'nativ':167 'need':91,171 'nest':39,57,106,584,660,726,729,737,755,773,819,851,873,1553,1560,1751 'new':339,530 'newkey':803,825,840,845 'node.js':166,264,411,623,784,997,1204,1498,1517,1544,1592,1735 'non':1699 'non-ascii':1698 'notat':664,1558 'npm':179 'nr':974,979 'null':293,540,811 'null/undefined':1397 'number/string':1412 'numer':1630 'nyc':692,862,884 'obj':319,323,510,514,519,669,671,788,797,800 'object':58,279,379,731,779,814,820,1011,1502,1525,1555,1752 'object.assign':821 'object.entries':1233 'object.keys':282 'of':973 'oper':174 'option':150,628,632 'orders.csv':996 'output':874,1613,1674 'output.csv':240,263 'output.json':390 'packag':170 'pars':178,183,425,1008,1518,1627,1636 'parsecsvvalu':431,483,490 'parser':1406 'pipelin':31 'practic':1366 'prefix':789,804,805 'preserv':1416,1599 'pretti':369 'price':619,620,1159 'print':370,976,981 'process':29,116,1376,1723,1742,1784 'processor':131 'product':1316,1322,1328,1334 'products.json':622,1161 'prompt':1445 'proper':1438,1671 'pure':392 'push':1228 'quot':429,1436,1440,1669 'r':213,229,248,917,930,1491 'rate':1363 'recommend':1622 'recurs':776,817 'reduc':668 'region':1185,1187,1189,1314,1320,1326,1332,1342 'remov':936 'replac':442 'report':64,122 'requir':123,148,966 'reshap':60 'respons':25,118,1778 'result':455,493,634,644,652,680,712,724,1017,1023,1030,1080,1239,1247,1254,1278,1289,1301,1310,1339,1362,1681,1771 'result.filter':645,1024 'result.map':653,1031 'result.push':482,489 'result.sort':1050 'return':274,296,306,309,326,424,438,444,492,518,520,677,679,847,1041,1070,1078,1232,1309,1679 'revers':932,1048,1071,1110 'row':399,911,938,1020,1032,1039,1101,1523,1572 'row.country':1102 'rsn':401 'run':1724 'salari':1174,1176 'sale':1193,1195,1198,1200,1313,1341 'sales.json':1203 'san':346,534 'scrape':1785 'see':1765 'select':567,575,607,777,901,947,1026,1034,1037,1042,1531,1533 'selectcolumn':1004,1029,1104 'selectcolumns.foreach':1035 'separ':759,790,806,826,1476,1571 'sf':701 'similar':1123 'simpl':198 'simpler':256 'singl':597 'skill':187 'skill-json-and-csv-data-transformation' 'solut':1638,1661,1682,1704,1728,1757 'sort':925,933,949,1043 'sortbi':1006,1045,1049,1107 'source-besoeasy' 'special':1610,1692 'specif':34,97,245,549,555,648,902 'split':403,419,446 'splitcsvlin':452,496,507 'sql':1125 'st':860,882 'str':298,310 'str.includes':302,303,304 'str.replace':307 'stream':381,1367,1405,1623,1730,1736 'street':589,746,857 'string':299,834,1426,1505 'stringifi':186,1568 'structur':40,108,734,774,1561,1617,1689,1756,1788 'sudo':153 'suit':137 'sum':1145,1253,1257,1259,1269,1282,1351 'support':168,659 'symptom':1632,1653,1677,1697,1722,1750 'syntax':257,1647,1686 'tabular':110,1563 'tag':868,889 'text':1446 'tool':124,140 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-clawdbot' 'topic-clawdbot-skill' 'topic-llm-tools' 'topic-mcp-server' 'topic-openai' 'topic-openclaw' 'topic-vibe-coding' 'topic-vibecoding' 'total':978,1157,1192,1348 'transform':6,7,45,46,96,616,892,895,1002,1007,1097,1113,1389,1453,1460,1660,1776 'transformcsv':1000,1098 'troubleshoot':1625 'true':577,1111 'two':987 'type':778,781,1345,1350,1357,1407,1418,1421 'typeof':812 'ubuntu/debian':152 'undefin':295 'unescap':1664 'uniq':944 'unsort':216,232 'usa':612,954,1089,1095,1103 'usag':331,522,681,849,1081,1311 'use':20,70,71,86,101,112,254,391,1370,1393,1404,1485,1511,1529,1536,1545,1576,1729 'user':76,683,714,716,869,890,1457 'user.age':717 'users.csv':909,922,931,943,955,995 'users.json':253,562,570,601,613,752,1144 'utf':1430,1706,1711,1714 'val':290,292,294,300,432,433,445 'val.endswith':437 'val.slice':439 'val.startswith':436 'val.trim':434 'valid':1383,1612,1639 'valu':287,427,506,516,617,666,676,766,767,799,810,813,816,824,830,842,846,913,1146,1395,1443,1477,1543,1609 'verifi':1687 'west':1327,1333 'wrong':1657 'y':158 'york':340,531 'zip':750","prices":[{"id":"83d08a21-6019-4793-be4d-f6d1804ead9c","listingId":"7563c817-0990-48b5-8587-b35f3d92045e","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"besoeasy","category":"open-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:10:48.064Z"}],"sources":[{"listingId":"7563c817-0990-48b5-8587-b35f3d92045e","source":"github","sourceId":"besoeasy/open-skills/json-and-csv-data-transformation","sourceUrl":"https://github.com/besoeasy/open-skills/tree/main/skills/json-and-csv-data-transformation","isPrimary":false,"firstSeenAt":"2026-04-18T22:10:48.064Z","lastSeenAt":"2026-05-02T12:55:04.068Z"}],"details":{"listingId":"7563c817-0990-48b5-8587-b35f3d92045e","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"besoeasy","slug":"json-and-csv-data-transformation","github":{"repo":"besoeasy/open-skills","stars":111,"topics":["agent-skills","ai","ai-agents","claude-code","clawdbot","clawdbot-skill","llm-tools","mcp-server","openai","openclaw","vibe-coding","vibecoding"],"license":null,"html_url":"https://github.com/besoeasy/open-skills","pushed_at":"2026-03-31T13:05:30Z","description":"Battle-tested skill library for AI agents. Save 98% of API costs with ready-to-use code for crypto, PDFs, search, web scraping & more. No trial-and-error, no expensive APIs.","skill_md_sha":"3863163ffda35f5610f1ec848faf1806e83a6b11","skill_md_path":"skills/json-and-csv-data-transformation/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/besoeasy/open-skills/tree/main/skills/json-and-csv-data-transformation"},"layout":"multi","source":"github","category":"open-skills","frontmatter":{"name":"json-and-csv-data-transformation","description":"Transform data between JSON, CSV, and other formats with filtering, mapping, and flattening. Use when: (1) Converting API responses to CSV, (2) Processing data pipelines, (3) Extracting specific fields, or (4) Flattening nested structures."},"skills_sh_url":"https://skills.sh/besoeasy/open-skills/json-and-csv-data-transformation"},"updatedAt":"2026-05-02T12:55:04.068Z"}}