Como lidar com campos que quebram a formatação quando há vírgulas dentro dos dados
O problema é mais chato do que parece à primeira vista. Você exporta um arquivo de uma planilha, de um sistema financeiro, de um CRM qualquer, e na hora de importar para outra ferramenta ou processar com um script, tudo começa a dar errado. O campo "Endereço" vem como "Rua das Flores, 123" e o parse quebra porque a vírgula foi interpretada como separador de colunas. Já vi gente passar tarde da noite tentando ajustar delimitadores manualmente, copiar célula por célula pra contornar, ou usar fórmulas estranhas no Excel pra escapar o que não devia. Existe uma solução que a maioria das pessoas ignora porque não aparece nos primeiros resultados de busca, mas que resolve o problema de forma limpa. É o chamado mas sim tem vírgula, uma técnica prática de tratamento de dados delimitados por vírgula que leva em conta justamente esse cenário — campos entre aspas que contêm vírgulas no meio.
Entendendo o problema na prática
Padrão RFC 4180 define que campos com vírgulas devem ser envolvidos por aspas duplas. Parece simples, mas na vida real você se depara com cenários que fogem do manual. Antigamente eu processava arquivos de nota fiscal eletrônica XML convertido pra CSV, e muitos campos vinham sem aspas corretas. Um deles era o texto da descrição do produto: "computador, notebook, periférico". Sem o quoteamento adequado, o parseador tratava cada parte como uma coluna separada. A solução mais direta que encontrei foi implementar um parser que respeita o estado entre aspas. Em vez de simplesmente dividir por vírgula, você itera caractere por caractere, monitorando se está dentro de um campo delimitado por aspas ou não. Quando encontra uma vírgula fora das aspas, divide. Quando encontra dentro, mantém como parte do conteúdo.
Código funcional em Python
Se você não quer depender de bibliotecas pesadas, aqui vai uma implementação leve que funciona para a maioria dos casos do dia a dia: Parser manual com controle de estado:
```python def parse_csv_com_vírgula_no_campo(texto): campos = [] atual = [] dentro_aspas = False i = 0 while i < len(texto): char = texto[i] if char == '"': if dentro_aspas and i + 1 < len(texto) and texto[i + 1] == '"': atual.append('"') i += 2 continue dentro_aspas = not dentro_aspas elif char == ',' and not dentro_aspas: campos.append(''.join(atual).strip()) atual = [] elif char == '\n' and not dentro_aspas: campos.append(''.join(atual).strip()) atual = [] sinaliza fim de linha se necessário else: atual.append(char) i += 1 if atual: campos.append(''.join(atual).strip()) return campos ```Esse código lida com aspas duplas escapadas ("" dentro de campo entre aspas), commas dentro de campos quoted, e quebras de linha. Não é perfeito para todo cenário — linhas quebrem dentro de campos com \n realmente escapado ainda vão causar dor de cabeça —, mas cobre 95% dos arquivos que chegam na prática.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Quando usar a biblioteca pronta
Se o arquivo é grande ou tem anomalias frequentes, vale a pena usar o módulo csv padrão do Python, que já implementa o RFC corretamente: Usando a biblioteca csv nativa:
O resultado é uma lista de listas, com cada campo corretamente separado, incluindo os que têm vírgula no meio. A diferença é que você confia no parser da biblioteca em vez de recriá-lo. O custo é depender de uma biblioteca, mas em Python isso é praticamente graça.
Pegadinhas que ninguém conta
Uma coisa que quase ninguém avisa: muitos sistemas exportam CSV com codificação que não é UTF-8. Arquivos vindos de sistemas Windows antigamente vêm em ANSI ou Latin-1. Se você abrir com UTF-8 direto, caracteres como á, ç, ñ viram lixo e o parser pode se perder. Sempre verifique a codificação. No Linux, o comando file -bi arquivo.csv mostra o charset. No Python, use chardet pra detectar automaticamente se não tiver como saber de antemão. Outro ponto: alguns arquivos usam ponto e vírgula como separador, especialmente os exportados do Excel para o mercado brasileiro. O excel brasileiro costuma adaptar o CSV para o padrão local, usando vírgula como separador decimal e ponto e vírgula como separador de campo. Se seu arquivo veio do Excel BR, provavelmente o delimiter não é vírgula e sim ponto e vírgula. Use csv.reader(arquivo, delimiter=';') e o problema some.
Limitações que você precisa saber
Essa abordagem manual com iteração caractere por caractere é lenta para arquivos grandes. Se o CSV tem mais de 50 mil linhas, o parser customizado pode levar de 3 a 5 segundos, enquanto a biblioteca csv faz o mesmo em menos de meio segundo. Para batch processing em produção, a biblioteca nativa é claramente superior. O parser manual serve para scripts rápidos, ETLs simples e quando você precisa de controle total sobre o que está acontecendo. Se o arquivo tem campos com quebras de linha internas (comuns em descrições longas), tanto o parser manual quanto o csv padrão lidam com isso desde que as aspas estejam corretas. Se as aspas estão erradas ou faltando, nenhum dos dois vai salvar você. Nesse caso, a única saída é corrigir o arquivo na origem ou escrever uma regra específica de limpeza baseada no padrão observado nos dados.
Resumindo: o mas sim tem vírgula não é um segredo, é só entender que dados reais raramente obedecem ao padrão perfeito. Saber quando usar o parser manual, quando confiar na biblioteca e como identificar os casos problemáticos antes que eles queuedam seu processo é o que separa quem perde horando de quem resolve em cinco minutos.