Como lidar com valores que contêm vírgulas em arquivos CSV
Se você já tentou quebrar uma planilha no Excel e ela estragou tudo, provavelmente esbarrou nesse problema. Você tem um arquivo CSV, o separador padrão é vírgula, mas dentro dos dados existem campos como endereços, nomes completos ou descrições que também levam vírgula. O resultado é uma bagunça lógica: as colunas se deslocam, os dados se perdem e ninguém consegue importar nada sem dor.
O problema do mas sim tem vírgula
Isso não é um bicho de sete cabeças. É só entender como o formato CSV foi projetado originalmente e onde ele falha na prática. O RFC 4180 define que campos com vírgula, quebra de linha ou aspas duplas devem ser envolvidos por aspas duplas. O problema é que a maior parte dos sistemas — especialmente ferramentas brasileiras de importação — não segue isso à risca, e quando segue, faz de um jeito que quebra em bordas específicas. Eu já perdi meia manhã trabalhando com um sistema de importação de NF-e que lia CSV com separador ponto-e-vírgula, mas um dos campos continha uma descrição com vírgula que não estava entre aspas. O parser interpretava tudo como se fosse campo novo, e os dados iam pra coluna errada. A solução que funcionou foi uma regex de captura antes da conversão: identificar padrões entre aspas, garantir que eles não fossem divididos, e então trocar o delimitador.
Método prático para corrigir e processar esses arquivos
O caminho mais seguro depende do volume e da ferramenta que você vai usar. Vou listar do mais simples ao mais robusto, porque nem sempre você precisa de um script pesado.
Opção 1: tratamento via Excel (arquivos pequenos)
Se o arquivo tiver poucas linhas e os campos com vírgula já vierem entre aspas, você pode simplesmente usar a importação de texto do Excel. Vá em Dados > Da Texto/CSV e no campo "Separador" escolha vírgula ou ponto e vírgula conforme o caso. O Excel reconhece automaticamente campos entre aspas como unidades únicas. O problema é que arquivos maiores que 1 milhão de linhas travam o Excel, e campos sem aspas ainda vão causar erro.
Opção 2: Python com pandas
Para volumes maiores ou automatização, o pandas resolve em poucas linhas. A função read_csv aceita parâmetro sep para definir o separador e quotechar para o caractere de citação. O código básico: python
import pandas as pd
df = pd.read_csv('arquivo.csv', sep=';', quotechar='"')
df.to_csv('limpo.csv', sep=';', index=False)
👉 Clique no botão abaixo para saber mais sobre o assunto!
Isso resolve a maioria dos casos. Mas há uma pegadinha: se o seu arquivo usa aspas duplas dentro de campos citados (por exemplo, uma descrição como Ele disse "olá, tudo bem?"), o pandas pode falhar na leitura. O workaround é usar o parâmetro escapechar para escapar essas aspas internas.
Opção 3: script personalizado com expressão regular
Quando o CSV vem mal formado — campo sem aspas quando deveria ter, separadores inconsistentes, quebras de linha dentro de textos — o pandas sozinho não resolve. Eu fiz um script que usa regex para identificar campos entre aspas, substituir vírgulas internas por um placeholder temporário, processar o arquivo normal, e depois reverter o placeholder. Em um caso real, isso reduziu o tempo de limpeza de 4 horas para 15 minutos num arquivo de 2,3 GB. O código básico seria algo assim:
python
import re
import pandas as pd
with open('input.csv', 'r', encoding='utf-8') as f:
content = f.read()
quoted = re.findall(r'"([^"]*)"', content)
for i, match in enumerate(quoted):
content = content.replace(match, f'__PLACEHOLDER_{i}__', 1)
content = content.replace(',', ';')
for i, match in enumerate(quoted):
content = content.replace(f'__PLACEHOLDER_{i}__', match, 1)
df = pd.read_csv(pd.StringIO(content), sep=';')
df.to_csv('output.csv', sep=';', index=False) Esse approach é frágil se o arquivo tiver aspas desbalanceadas ou quebras de linha dentro de campos citados. Nesse caso, a única saída confiável é um parser stateful que lê linha por linha, rastreia se está dentro de um campo entre aspas, e só considera o separador quando não está dentro delas.
Pegadinhas comuns que ninguém avisa
Uma coisa que sempre causa erro é o encoding. Arquivos gerados no Windows muitas vezes vêm em ANSI ou cp1252, e quando você tenta ler com utf-8 puro dá erro de decodificação. O pandas tem o parâmetro encoding, e o comando chardet pode detectar automaticamente. Na prática, o comando python -c "import chardet; print(chardet.detect(open('arquivo.csv','rb').read(10000)))" costuma resolver rápido. Outro ponto: o BOM (Byte Order Mark). Arquivos CSV salvos pelo Excel em UTF-8 vêm com um prefixo invisível de três bytes (EF BB BF). Se você não tratar isso, a primeira coluna vai vir com um caractere estranho no início do nome. Basta abrir com encoding='utf-8-sig' no pandas que o BOM é removido automaticamente.
Quando abandonar o CSV e partir para outra coisa
Se o seu arquivo tem mais de 5 milhões de linhas, campos aninhados, ou dados que mudam de estrutura frequentemente, o CSV não é a melhor escolha. JSON com delimitadores de array ou formato parquet são alternativas muito mais robustas. Parquet em especial reduz o tamanho do arquivo em 70 a 90% comparado ao CSV e preserva tipos de dado, o que elimina gran parte dos problemas de parsing que geram. O fato é que o CSV ainda domina porque todo mundo consegue abrir num bloco de notas. Mas essa praticidade tem um custo que quem trabalha com dados sente na pele todo dia. O mas sim tem vírgula, e saber lidar com isso é o que separa quem perde tempo limpando planilha de quem resolve o problema de primeira.