ICS to CSV Converter
Flatten the events in an iCalendar (.ics) file into a clean CSV table — one row per event with summary, start, end, location and description, plus status, categories and UID when present. Paste the file contents; everything runs in your browser and nothing is uploaded.
About this tool
ICS to CSV turns an iCalendar file — the .ics format that Google Calendar,
Apple Calendar, Outlook and event invites export — into a clean CSV table you can
open in a spreadsheet or import anywhere. Paste the file contents and you get one
row per event with these columns:
summary, start, end, location, description
plus status, categories and uid columns whenever your events carry
them, so the CSV never has a column of blanks. Folded lines are unfolded, RFC 5545
text escapes (\n, \,, \;) are decoded back to real characters, alarm and
timezone sub-blocks are skipped, and every field is RFC-4180 escaped so summaries
or descriptions containing commas, quotes or newlines stay intact.
Everything runs locally in your browser — the calendar never leaves your device.
Worked example
Input (one event):
BEGIN:VCALENDAR
BEGIN:VEVENT
UID:[email protected]
SUMMARY:Team Standup
DTSTART:20240309T081530Z
DTEND:20240309T083000Z
LOCATION:Room 4
DESCRIPTION:Daily sync
END:VEVENT
END:VCALENDAR
Output (defaults — comma delimiter, header on, ISO dates):
summary,start,end,location,description,uid
Team Standup,2024-03-09T08:15:30Z,2024-03-09T08:30:00Z,Room 4,Daily sync,[email protected]
Options
- Delimiter — comma, semicolon (handy for comma-decimal locales), tab (TSV), or pipe.
- Include header row — turn the column-name row off for a headerless CSV.
- Date column format —
isonormalizes to ISO-8601 (20240309T081530Z→2024-03-09T08:15:30Z,20240704→2024-07-04),rawkeeps the original.icsvalue text, andunixconverts to epoch seconds. - Include location / description — drop either column when you don't need it (descriptions can be long).
Limits & edge cases
- Only
VEVENTblocks become rows.VTODO,VJOURNALandVFREEBUSYare ignored, andVALARM/VTIMEZONEsub-blocks inside an event are skipped so their fields never leak into the event row. - All-day events use a date-only
DTSTART/DTEND; theDTENDof an all-day event is the exclusive end date per the iCalendar spec — it is copied through as written, not adjusted. unixepoch treatsZ(UTC) times exactly; floating times andTZIDtimes are read as wall-clock UTC because the tool ships no timezone/DST database. Useraworisoto keep the original wall-clock value untouched.- Recurrence (
RRULE) is not expanded — a repeating event is one row for its masterDTSTART, not one row per occurrence. - A date value the parser can't read is passed through unchanged rather than failing the whole conversion.
FAQ
What columns does the CSV have?
Always summary, start, and end, then location and description unless you
turn those off. status, categories and uid columns are added automatically
whenever at least one event includes them, so you never get a column that is
entirely empty. An empty cell means that event didn't record that value.
Does it handle all-day events and different date formats?
Yes. Date-only values like DTSTART;VALUE=DATE:20240704 are recognized as all-day
events and written as 2024-07-04. Timed values are normalized to ISO-8601, or you
can switch the date format to raw to keep the original .ics text or unix for
epoch seconds. Z-suffixed times are UTC; floating and TZID times are read as
wall-clock UTC.
Why did some events not turn into rows?
Only calendar events (VEVENT blocks) are exported. To-dos (VTODO), journal
entries (VJOURNAL) and free/busy blocks (VFREEBUSY) are skipped, and a
repeating event appears once for its master start date — recurrences (RRULE) are
not expanded into individual occurrences.
Is my calendar file uploaded anywhere?
No. The conversion runs entirely in your browser using WebAssembly — the .ics
text you paste is processed on your own device and is never sent to a server.
Developer & Automation Access
Run it from the terminal
Same engine as this page, headless — via the gizza CLI:
gizza tool ics-to-csv "BEGIN:VCALENDAR
BEGIN:VEVENT
SUMMARY:Team Standup
DTSTART:20240309T081530Z
DTEND:20240309T083000Z
LOCATION:Room 4
END:VEVENT
END:VCALENDAR"New to the CLI? Get gizza →
Open it by URL
Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:
https://gizza.ai/tools/ics-to-csv/?ics=BEGIN%3AVCALENDAR%0ABEGIN%3AVEVENT%0ASUMMARY%3ATeam%20Standup%0ADTSTART%3A20240309T081530Z%0ADTEND%3A20240309T083000Z%0ALOCATION%3ARoom%204%0AEND%3AVEVENT%0AEND%3AVCALENDAR&delimiter=comma&header=true&date_format=iso&include_location=true&include_description=trueMachine-readable descriptor: tool.json — title + parameters JSON Schema for agents.
