Dataset Format Converter
Pricing
from $5.00 / 1,000 converted outputs
Dataset Format Converter
Turn any Apify dataset or JSON list into ready-to-import files: CSV (UK Excel-safe), JSON Lines, PostgreSQL and SQL Server scripts with inferred types, a Microsoft Dataverse table and import file, and validated iCalendar. Deterministic field mapping, no AI guessing. See README.
Pricing
from $5.00 / 1,000 converted outputs
Rating
0.0
(0)
Developer
LandlordTools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 hours ago
Last modified
Categories
Share
Turn any Apify dataset, or a JSON list, into the exact file the next system needs, in one run: CSV in the right style for UK, US or European Excel, Salesforce, HubSpot or Airtable; SQL scripts for seven databases with column types worked out; a Microsoft Dataverse table definition and import file; BigQuery load files; maps; calendars; feeds; sitemaps; real .xlsx workbooks; contact cards; search, time-series and document-database load files; fixed-width text for legacy importers; Parquet for data lakes; shopping feeds for Google, Meta and Shopify; bank-statement imports for Xero, QuickBooks, Sage and FreeAgent; and Teams and Slack cards. 44 targets.
It is deterministic: field mapping is explicit (or everything is flattened), so the same input always gives the same files and you can check them. Nothing goes to an AI service. Every format is read back by the test suite: CSV is parsed, JSON parsed, XML checked for well-formedness, the SQLite script is executed, and calendars pass an RFC 5545 validator 4.
Targets
| Target | File(s) | What's special | For |
|---|---|---|---|
csv | output.csv | Plain RFC 4180 CSV (UTF-8, ISO dates or csvDateFormat) | Any tool, Google Sheets, Power BI |
tsv | output.tsv | Tab-separated | Databases, command-line tools |
excel-uk-csv | output-excel-uk.csv | BOM, dd/mm/yyyy dates, formula-injection guard | Excel (UK) |
excel-us-csv | output-excel-us.csv | BOM, mm/dd/yyyy dates, formula guard | Excel (US) |
excel-eu-csv | output-excel-eu.csv | BOM, ; separator, decimal commas, formula guard | Excel (most of Europe) |
salesforce-csv | output-salesforce.csv | UTF-8, ISO dates, UTC date-times, formula guard | Salesforce Data Import Wizard / Data Loader |
hubspot-csv | output-hubspot.csv | UTF-8, ISO dates, UTC date-times, formula guard | HubSpot imports |
airtable-csv | output-airtable.csv | UTF-8, ISO dates, formula guard | Airtable CSV import |
dataverse | dataverse-import.csv + dataverse-table.json | Import CSV with display-name headers, plus a table definition (column types, schema names with your publisher prefix, lengths) | Microsoft Dataverse / Power Apps / Power Automate |
json | output.json | Array of flat objects | APIs, web apps |
jsonl | output.jsonl | One object per line | Data pipelines, Elasticsearch, Splunk |
bigquery | bigquery-data.jsonl + bigquery-schema.json | Column names made BigQuery-safe, types and modes; exact NUMERICs | Google BigQuery (bq load --source_format=NEWLINE_DELIMITED_JSON) |
xml | output.xml | Well-formed XML with safe element names | Legacy systems, ETL tools |
yaml | output.yaml | YAML list (JSON-compatible scalars) | Config-driven tools |
html | output.html | Accessible HTML table | Email, intranets |
markdown | output.md | Markdown table (pipes escaped) | Docs, GitHub, Notion |
sql-postgres | output-postgres.sql | CREATE TABLE with inferred types + batched INSERTs | PostgreSQL, Supabase |
sql-sqlserver | output-sqlserver.sql | NVARCHAR/BIT/DECIMAL/DATETIMEOFFSET, batches of 1000 | SQL Server, Azure SQL |
sql-mysql | output-mysql.sql | Backtick identifiers, backslash-safe strings | MySQL, MariaDB |
sql-sqlite | output-sqlite.sql | Executed for real in the tests | SQLite |
sql-snowflake | output-snowflake.sql | NUMBER/TIMESTAMP_TZ | Snowflake |
sql-oracle | output-oracle.sql | VARCHAR2/CLOB, TO_TIMESTAMP_TZ, one INSERT per row | Oracle |
geojson | output.geojson | FeatureCollection of points (geoMapping) | QGIS, Mapbox, Leaflet, ArcGIS |
kml | output.kml | Placemarks with ExtendedData (geoMapping) | Google Earth, Google My Maps |
ics | output.ics | Events (icsMapping), validated against RFC 5545 before saving | Outlook, Google Calendar, Apple Calendar |
rss | feed.xml | RSS 2.0 feed (rssMapping) | Feed readers, Slack/Teams RSS apps |
sitemap | sitemap.xml | XML sitemap of URLs (sitemapMapping) | Search engines |
xlsx | output.xlsx | Real Excel workbook: numbers, true/false and dates stored as typed cells, bold frozen header row, filter on, column widths set; formula-like text stays text; byte-identical for the same input 11 | Excel, SharePoint, Teams, Google Sheets, Power BI |
vcard | contacts.vcf | vCard 4.0 contacts (vcardMapping), escaped and line-folded per RFC 6350 6 | Outlook, Google Contacts, iPhone, CRMs |
gpx | output.gpx | GPX 1.1 waypoints (geoMapping) 7 | GPS units, Garmin, Strava, field-survey apps, QGIS |
elasticsearch-bulk | elasticsearch-bulk.ndjson | _bulk body: an index action line before each document, index = tableName in lower case 8 | Elasticsearch, OpenSearch, Kibana (POST _bulk) |
influx-line | influx.lp | Line protocol (influxMapping): tags and keys escaped, integers marked i, nanosecond timestamps 9 | InfluxDB, Telegraf, QuestDB and other time-series stores (meter and SCADA data) |
mongodb-jsonl | mongodb.jsonl | Extended JSON (relaxed): date-times become {"$date": ...} so they load as real dates 10 | MongoDB (mongoimport), Atlas, Cosmos DB for MongoDB |
fixed-width | output-fixed-width.txt + fixed-width-layout.json | Space-padded columns (numbers right-aligned), CRLF, plus a layout file giving each field's start, width and type | Mainframe, COBOL, banking and utility billing importers |
parquet | output.parquet | Apache Parquet: typed columns (string, int64, double, boolean, date, UTC timestamp), GZIP pages; read back with pyarrow and DuckDB 12 | Microsoft Fabric, Databricks, Snowflake, BigQuery, Athena, DuckDB, pandas |
Platform presets
| Target | File | What it does | For |
|---|---|---|---|
google-merchant | google-merchant.tsv | Product feed (productMapping): 15.00 GBP prices, in_stock/out_of_stock/preorder/backorder, sale price from a higher wasPrice, GTIN check digits verified, identifier_exists set when there's no GTIN or brand + MPN, Google's length limits applied, commas in URLs encoded 13 | Google Merchant Center (Shopping ads, free listings) |
meta-catalog | meta-catalog.csv | Catalogue feed (productMapping): in stock/out of stock, up to 20 extra images within 2,000 characters, Meta's length limits; warns when brand is missing 14 | Meta Commerce Manager (Facebook and Instagram shops, Advantage+ catalogue ads) |
shopify-products | shopify-products.csv | Product import (productMapping): unique handles from titles, HTML body, compare-at price from wasPrice, extra images as extra rows, out-of-stock items as drafts 15 | Shopify admin > Products > Import |
xero-bank-csv | xero-bank-statement.csv | Date, Amount (money out negative), Payee, Description, Reference; UK or US date order (bankDateStyle) 18 | Xero bank statement import |
quickbooks-bank-csv | quickbooks-bank-statement.csv | 3-column Date, Description, Amount 19 | QuickBooks Online bank upload |
sage-bank-csv | sage-bank-statement.csv | Date, Description, Amount in that order, a description on every row, plus Reference and Payee name 16 | Sage Accounting bank import |
freeagent-bank-csv | freeagent-bank-statement.csv | No header; dd/mm/yyyy, amount to 2 decimal places, description with no commas, quotes or line breaks 17 | FreeAgent bank statement upload |
teams-card | teams-card.json | Adaptive Card 1.4 message (cardMapping): up to 20 items with links and facts; warns over Teams' 28 KB limit 21 | Teams incoming webhooks and Workflows, Power Automate |
slack-blocks | slack-blocks.json | Block Kit message (cardMapping): header, up to 20 linked items with fields, within Slack's block and text limits 20 | Slack incoming webhooks, chat.postMessage |
Platform presets load straight into the platform, so they don't add the spreadsheet formula guard (which would end up stored in the data). Item rows the platform would reject (no id, zero price, relative links, impossible dates) are skipped and counted in the warnings. Layouts were checked against each platform's help pages on 3 October 2026; platforms change their import screens, so check a small file first.
All spreadsheet targets except csv and tsv prefix cells that start with =, +, - or @ with an apostrophe, so a value can't run as a formula when opened (CSV injection) 5.
Input
{"items": [{"name": "Example site A","site": {"region": "West Midlands","lat": 52.4862,"lon": -1.8904},"start": "2026-11-02","tags": ["solar","battery"],"capacityMw": 12.5,"live": true,"url": "https://example.com/a"},{"name": "Example site B, phase 2","site": {"region": "East of England","lat": 52.2053,"lon": 0.1218},"start": "2027-01-15","tags": ["wind"],"capacityMw": 40,"live": false,"url": "https://example.com/b"},{"name": "=Example site C","site": {"region": "London","lat": 51.5072,"lon": -0.1276},"start": "2026-12-01T09:30:00Z","tags": [],"capacityMw": null,"live": true,"url": "https://example.com/c"}],"targets": ["excel-uk-csv","sql-postgres","dataverse","ics","geojson","xlsx"],"tableName": "sites","icsMapping": {"summary": "name","start": "start","location": "site.region"},"geoMapping": {"lat": "site.lat","lon": "site.lon","name": "name"}}
- Source:
items(a JSON list) ordatasetId(any Apify dataset this run's token can read 1; up to 20,000 items). targets: one or more from the table.fields(optional):[{"from": "site.region", "to": "Region", "type": "string"}]. Paths use dots for nesting and numbers for list positions (tags.0). Withoutfields, nested objects are flattened to dotted columns, lists of plain values are joined witharrayJoiner(default"; "), and lists of objects become JSON text.- Types are inferred per column (boolean, integer, number, date, date-time, string) and drive SQL, Dataverse and BigQuery column types. Override them with
fields[].type. - Mappings for the formats that need them (each value is a field path):
icsMapping:{summary, start, end?, description?, location?, uid?}geoMapping(geojson, kml, gpx):{lat, lon, name?}rssMapping:{title, link, channelLink, description?, date?, channelTitle?, channelDescription?}sitemapMapping:{loc, lastmod?}vcardMapping:{fn, org?, title?, email?, tel?, url?, address?, note?}(a list of emails or phone numbers gives one line each)productMapping(shopping feeds):{id, title, price, link, description?, imageLink?, additionalImages?, availability?, availabilityDate?, condition?, brand?, gtin?, mpn?, sku?, productType?, wasPrice?}, pluscurrency(ISO 4217, defaultGBP). Prices may be numbers or text such as£1,299.00; availability may betrue/false,InStockor a schema.org URL.bankMapping(bank statements):{date, amount, description?, payee?, reference?}. Dates are ISO or dd/mm/yyyy; amounts are signed (money out negative) or in brackets.bankDateStyle:uk(default) orus.cardMapping(Teams and Slack):{title, text?, link?, fields?}, wherefieldsis a comma-separated list of up to 10 columns shown as facts.influxMapping:{time, tags?}.timeis an ISO timestamp withZor an offset;tagsis a comma-separated list of columns to index as tags (every other column becomes a field). The measurement istableName.
- Energy add-on:
"enrich": {"settlementPeriodFrom": "timestamp"}adds GB electricitysettlementDateandsettlementPeriodcolumns (46, 48 or 50 periods a day around clock changes), so half-hourly data lines up with Elexon and supplier settlement data.
Output
Each file is saved in the run's key-value store under the name shown. The SCHEMA record holds the inferred columns, and the dataset gets one row per file (where it is, rows, bytes, warnings). The first row for the input above:
{"target": "excel-uk-csv","key": "output-excel-uk.csv","contentType": "text/csv; charset=utf-8","rows": 3,"columns": 9,"bytes": 369,"url": null,"warnings": []}
Warnings say when rows were skipped (for example, missing coordinates for a map) and why.
Limits
- Up to 20,000 items and 1,000 columns per run.
- SQL scripts are for loading data; review the inferred types before production use.
- Dataverse: create the table from
dataverse-table.json(Power Apps > Tables > New table), then importdataverse-import.csv(Import > Import data from Excel/CSV, or a dataflow) 2. - Excel cells hold at most 32,767 characters; longer text is cut, with a warning. Date-times go into
.xlsxin UTC. - Oracle string literals over 4,000 characters need loading another way (the column becomes CLOB).
Pricing
Pay per event: $5 per 1,000 results, plus Apify's tiny per-run start fee ($0.00005). See the Pricing tab for the current price.
Local use
With Node.js 22 or later, run node cli.js examples/input.json (writes files to ./out), or npm test.
Sources
- Apify: Get dataset items (API). Accessed 3 October 2026.
- Microsoft Learn: Import data into Dataverse (Power Apps). Accessed 3 October 2026.
- RFC 4180: Common Format and MIME Type for CSV Files. Accessed 3 October 2026.
- RFC 5545: iCalendar. Accessed 3 October 2026.
- OWASP: CSV Injection. Accessed 3 October 2026.
- RFC 6350: vCard Format Specification. Accessed 3 October 2026.
- GPX 1.1 Schema Documentation. Accessed 3 October 2026.
- Elastic: Bulk API. Accessed 3 October 2026.
- InfluxData: Line protocol (InfluxDB v2). Accessed 3 October 2026.
- MongoDB: Extended JSON. Accessed 3 October 2026.
- Ecma International: ECMA-376 Office Open XML File Formats. Accessed 3 October 2026.
- Apache Parquet: File format. Accessed 3 October 2026.
- Google Merchant Center: Product data specification. Accessed 3 October 2026.
- Meta: Catalog fields reference. Accessed 3 October 2026.
- Shopify Help Center: Product CSV columns. Accessed 3 October 2026.
- Sage: Supported file formats for bank statement imports. Accessed 3 October 2026.
- FreeAgent: Format a CSV file to upload a bank statement. Accessed 3 October 2026.
- Xero Central: Import a bank statement. Accessed 3 October 2026.
- QuickBooks: Format CSV files to get bank transactions into QuickBooks. Accessed 3 October 2026.
- Slack: Block Kit blocks reference. Accessed 3 October 2026.
- Microsoft Learn: Create an Incoming Webhook (Teams). Accessed 3 October 2026.