Converter ICS para CSV

Aqui você converte ICS para CSV de graça e sem conta: solte o arquivo acima e em poucos segundos o resultado está pronto para baixar. A conversão acontece dentro do seu próprio navegador, então o arquivo nunca é enviado. Funciona igual no Windows, no macOS e no Linux e também no iPhone e no Android, e continua funcionando mesmo se você cortar a conexão.

  • Onde roda No seu navegador. O arquivo nunca é enviado.
  • Reconstruído CSV funciona de um jeito diferente de ICS. Não é a degradação gradual de um codec com perda: o que CSV consegue expressar é reproduzido fielmente, e o que não tem equivalente ali não sobrevive de jeito nenhum.
  • Limite de tamanho Até 100 MB por arquivo, de graça e sem conta.
  • Vale saber Campos repetidos — vários telefones, vários participantes — são juntados numa célula em vez de espalhados por colunas inventadas. Regras de repetição, alarmes e anexos não têm lugar numa tabela e ficam de fora.

Até 100 arquivos de uma vez. Formatos misturados não são problema.

As perguntas que uma planilha responde sobre um calendário

Um aplicativo de calendário é feito para olhar para frente, e é fraco para olhar para trás em conjunto. Quantas horas foram para um cliente no trimestre passado. Qual reunião recorrente cresceu discretamente para catorze pessoas. Quanto de uma semana já está ocupado antes de alguém marcar qualquer coisa. Se uma sala foi usada nos dias em que estava reservada. Nenhuma dessas perguntas é uma visão dentro do calendário, e todas são uma tabela dinâmica.

Então o export existe para ser contado. Essa moldura importa porque decide o que esta conversão não consegue fazer é sério: perder a cor de um evento não é nada; perder o fato de que um evento se repetia é tudo. As próximas duas seções são sobre isso.

Um evento recorrente aparece uma vez só no CSV

É a parte a ler antes de confiar em qualquer total. No formato de calendário, uma série recorrente é guardada como um único evento carregando uma regra de recorrência — a reunião diária do último ano é um único `VEVENT` com um `RRULE` dizendo semanal em dias úteis até uma data, mais talvez algumas adições `RDATE` e exceções `EXDATE` para os dias em que foi cancelada.

As colunas geradas aqui são as próprias propriedades do evento: resumo, início, fim, local, descrição, organizador, status, identificador e participantes. `RRULE`, `RDATE` e `EXDATE` não estão entre elas, então a série contribui com exatamente uma linha, mostrando os horários da primeira ocorrência. Um trimestre de reuniões diárias vira uma linha de trinta minutos. Qualquer soma da coluna de duração fica errada pela diferença de quanto os eventos recorrentes realmente consumiram, que na maioria das agendas de trabalho é a maior parte do tempo.

Expandindo a série antes de exportar o ICS

A correção é rio acima, e é mais fácil do que parece. Tanto o Google Agenda quanto o Outlook, quando pedidos para exportar ou imprimir um intervalo de datas em vez de um calendário inteiro, geram as ocorrências individuais em vez da regra — então exportar «este trimestre» dá um arquivo em que cada reunião diária é seu próprio `VEVENT`, e cada uma vira uma linha.

Onde isso não está disponível, expansão é trabalho de script, não de planilha: o `icalendar` do Python com `dateutil.rrule`, ou o pacote `ical-expander` para Node, percorrem uma série entre duas datas e produzem as ocorrências. De qualquer forma, faça a expansão enquanto o arquivo ainda é um ICS. Depois que virar tabela, a regra desapareceu e nada consegue reconstruí-la, porque a tabela nunca a carregou.

As nove colunas em que um evento ICS se transforma

Em ordem: `summary`, `start`, `end`, `location`, `description`, `organizer`, `status`, `uid`, `attendees`. Todo evento produz uma linha com as nove, vazia onde o evento não tinha aquela propriedade, então a tabela fica retangular independente de quão desigual for a origem.

Duas colunas merecem atenção. `status` distingue eventos confirmados, provisórios e cancelados, e os cancelados ainda geram linhas — filtre-os antes de contar, ou uma oficina cancelada de um dia inteiro vai entrar na conta como tempo gasto. E `uid` é um identificador estável atribuído pelo calendário, o único jeito confiável de remover duplicatas quando dois exports se sobrepõem.

Fuso horário: algumas células carregam um Z e outras não

Os horários são reescritos da forma compacta do calendário para ISO 8601, então `20260301T080000Z` vira `2026-03-01T08:00:00Z`, que toda planilha reconhece. O que não é feito é qualquer conversão entre fusos.

Um valor escrito em UTC mantém seu Z no final. Um valor qualificado por um parâmetro `TZID` — `DTSTART;TZID=America/Sao_Paulo:20260301T080000` — é local a esse fuso, e é escrito como `2026-03-01T08:00:00` sem Z e sem deslocamento. Convertê-lo exigiria um banco de dados de fusos horários, e assumir UTC deslocaria cada compromisso em uma hora ou mais. O resultado é uma coluna onde algumas células declaram seu fuso e outras não. Se você está somando durações, isso é inofensivo, já que início e fim compartilham fuso. Se está comparando horários entre uma equipe distribuída, não é, e o fuso tem de vir do arquivo original.

Eventos de dia inteiro, e a data de fim que vem um dia depois

Um evento de dia inteiro é escrito com valores de data, não de horário, e converte para um simples `2026-03-01` nas colunas de início e fim, sem parte de horário. Isso é inequívoco e ordena corretamente, o que já é mais do que se pode dizer da maioria do tratamento de datas.

A pegadinha está no formato, não na conversão: para um valor de data, o fim é exclusivo. Um evento de um dia no dia 3 é armazenado começando no dia 3 e terminando no dia 4, e uma oficina de três dias a partir do dia 3 termina no dia 6. Subtraia um dia antes de relatar um intervalo de datas a uma pessoa, e cuidado com qualquer fórmula que calcule duração — a aritmética está certa para o formato e errada para a frase que alguém vai escrever a partir dela.

Eventos que declaram uma duração em vez de um fim

O formato de calendário permite que um evento declare um início e uma duração em vez de um início e um fim, e alguns programas usam essa forma para tudo. Só a propriedade de fim é mapeada para uma coluna, então esses eventos chegam com início preenchido e fim vazio.

É silencioso, não destrutivo, e é bem fácil de passar despercebido numa tabela grande, porque células vazias parecem dado opcional. Se a coluna de fim está esparsa, é esse o motivo — ordene por ela e veja se os vazios se concentram numa origem só. Recuperar o valor significa voltar ao ICS e ler a propriedade de duração, tarefa para script, não para planilha.

Participantes e organizadores chegam com nome quando o arquivo tinha

Um convite guarda um participante como endereço no valor e um nome de exibição num parâmetro. A metade legível é a que fica, então a célula traz «Ana Souza» onde o convite carregava um nome comum e `[email protected]` onde não carregava. Vários participantes são juntados com ponto e vírgula e espaço numa célula só. O organizador é tratado do mesmo jeito, na própria coluna.

É uma escolha deliberada em vez de inventar `participante1` até `participante9`, que truncaria o décimo e deixaria nove colunas quase vazias para todo mundo. Contar participantes vira então uma fórmula sobre a célula, não uma contagem de colunas. Separar a célula em linhas é um passo de Power Query ou um script de duas linhas, se você precisar de uma linha por pessoa.

Só eventos são lidos, então uma lista de tarefas não gera nada

O formato de calendário carrega mais do que compromissos. Tarefas são `VTODO`, entradas de diário são `VJOURNAL`, blocos de disponibilidade são `VFREEBUSY`, e alarmes ficam dentro dos eventos como `VALARM`. Só `VEVENT` é lido aqui.

Um arquivo que só tem tarefas para, então, com «Nenhum evento de calendário foi encontrado neste arquivo», o que é preciso, não uma falha — um export de um aplicativo de lembretes não é um calendário de eventos, mesmo compartilhando a extensão. Alarmes, anexos e status de resposta por participante são descartados dos eventos que são lidos, pelo mesmo motivo da recorrência: uma tabela não tem forma para eles.

Abrindo o CSV sem estragar os horários

Importe em vez de abrir direto. No Excel, Dados e depois De Texto/CSV, e defina as colunas de início e fim como Texto na entrada, a menos que você queira que o Excel reinterprete — a análise de data dele vai remover o deslocamento sem pedir licença, reformatar segundo o idioma da máquina, e transformar uma string ISO em algo que não ordena mais como texto. A coluna do identificador também deve ser Texto.

Descrições são a outra coisa a vigiar. Descrições de reunião rotineiramente têm vírgulas, aspas e quebras de linha de verdade — uma pauta colada, um bloco de número de discagem — e as três são tratadas envolvendo o valor em aspas com aspas internas duplicadas, a convenção RFC 4180 que todo importador competente lê. Uma quebra ingênua por vírgulas num pipeline de shell não vai funcionar; use um leitor de CSV de verdade ou converta para TSV.

Como converter ICS para CSV

  1. Solte o seu arquivo ICS nesta página, ou clique para escolher um.
  2. Escolha CSV como destino. A conversão acontece no seu navegador e o arquivo não é enviado.
  3. Baixe o arquivo CSV pronto.

ICS ou CSV: o que muda

ICS comparado com CSV
ICSCSV
Nome completoiCalendarComma-Separated Values
Extensão do arquivo.ics, .ical.csv
Tipo de mídiatext/calendartext/csv
Publicado pela primeira vez19981972
EspecificaçãoRFC 5545RFC 4180
LicençaPadrão abertoPadrão aberto
Situação hojeAtualAtual
Abre no navegadorNenhum navegadorNenhum navegador
Considerado no lugarXLSX, JSON, Parquet

Abrir o resultado

Os programas de sempre não se cruzam: ICS abre em Google Calendar, Apple Calendar e Microsoft Outlook, e CSV em Microsoft Excel, LibreOffice Calc e pandas, então quem receber o resultado precisa de algum do segundo grupo.

Para que serve cada formato

ICS foi publicado em 1998. Está descrito em RFC 5545, e vale conhecer se o arquivo precisa sobreviver à ferramenta que o escreveu.

CSV e de 1972, descrito em RFC 4180. Microsoft Excel, LibreOffice Calc e pandas leem o formato.

CSV foi publicado em 1972 e ICS em 1998. O mais antigo costuma ser o arquivo mais seguro para entregar; o mais novo faz o mesmo com menos bytes.

De ICS para CSV: perguntas frequentes

Meu arquivo ICS é enviado para algum lugar?

Não. Esta conversão acontece inteiramente no seu navegador, então o arquivo não sai do seu aparelho. Você mesmo pode conferir: abra a aba de rede das ferramentas de desenvolvedor e converta alguma coisa. Você verá a própria página e as requisições de estatística e de publicidade com que este serviço é pago, e nenhuma que leve o seu arquivo.

Converter ICS para CSV é grátis?

É. Sem conta, sem marca d’água e sem cota diária para gastar: roda no seu próprio aparelho, então você pode voltar quantas vezes quiser. O navegador processa arquivos de até 100 MB, 100 por vez.

Perde qualidade ao converter ICS para CSV?

ICS e CSV descrevem o conteúdo de maneiras radicalmente diferentes. A conversão é, portanto, uma reconstrução e não uma cópia: fiel, mas não idêntica byte a byte. Campos repetidos — vários telefones, vários participantes — são juntados numa célula em vez de espalhados por colunas inventadas. Regras de repetição, alarmes e anexos não têm lugar numa tabela e ficam de fora.

Preciso instalar alguma coisa para abrir um arquivo CSV?

Para a conversão, não: ela acontece no navegador que você já tem aberto. Para abrir o resultado você precisa depois do programa com que o seu aparelho normalmente exibe Comma-Separated Values.

Mais sobre esses formatos