Dicas de Limpeza de Dados CSV para Analistas e Programadores
Os ficheiros CSV são o formato universal de troca para dados tabulares. São simples, legíveis por humanos e suportados por todas as ferramentas, desde o Excel ao pandas. Mas os ficheiros CSV do mundo real são frequentemente confusos — codificações inconsistentes, valores em falta, tipos de dados mistos e linhas malformadas. Este guia abrange técnicas práticas para limpar dados CSV de forma fiável.
Problemas Comuns em CSV
1. Problemas de Codificação
O problema mais frustrante em CSV é a codificação. Um ficheiro criado no Windows no Excel pode utilizar windows-1252, enquanto o seu script Python espera utf-8.
Sintomas: Caracteres ilegíveis (mojibake) como é em vez de é, ou exceções UnicodeDecodeError.
Deteção:
import chardet
with open('data.csv', 'rb') as f:
result = chardet.detect(f.read(10000))
print(result) # {'encoding': 'Windows-1252', 'confidence': 0.73}
Correção: Leia com a codificação detetada e depois guarde como UTF-8:
import pandas as pd
df = pd.read_csv('data.csv', encoding='windows-1252')
df.to_csv('data_clean.csv', encoding='utf-8', index=False)
2. Delimitadores Inconsistentes
Nem todos os "CSVs" utilizam vírgulas. Os ficheiros CSV europeus utilizam frequentemente ponto e vírgula porque as vírgulas são separadores decimais em muitas localidades europeias.
# Auto-detect delimiter
import csv
with open('data.csv', 'r') as f:
dialect = csv.Sniffer().sniff(f.read(5000))
print(f"Delimiter: {repr(dialect.delimiter)}")
O nosso Editor de CSV trata da deteção de delimitadores automaticamente — cole os seus dados e ele identifica o formato.
3. Valores em Falta
Os dados em falta aparecem de muitas formas: células vazias, NA, N/A, null, -, ou apenas espaços em branco.
# Standardize all missing value representations
df = pd.read_csv('data.csv', na_values=['NA', 'N/A', 'null', '-', '', ' '])
# Check missing values per column
print(df.isnull().sum())
# Strategy 1: Drop rows with missing critical fields
df = df.dropna(subset=['email', 'name'])
# Strategy 2: Fill with defaults
df['country'] = df['country'].fillna('Unknown')
# Strategy 3: Forward fill (time series)
df['price'] = df['price'].ffill()
4. Linhas Duplicadas
Os duplicados exatos são fáceis de encontrar. Os duplicados aproximados (a mesma pessoa com ortografia ligeiramente diferente do nome) são mais difíceis.
# Find exact duplicates
duplicates = df[df.duplicated(keep=False)]
print(f"Found {len(duplicates)} duplicate rows")
# Remove duplicates, keeping the first occurrence
df = df.drop_duplicates()
# Remove duplicates based on specific columns
df = df.drop_duplicates(subset=['email'], keep='last')
5. Formatos de Dados Inconsistentes
Datas em formatos mistos, números de telefone com e sem indicativo de país, capitalização inconsistente:
# Standardize dates
df['date'] = pd.to_datetime(df['date'], format='mixed', dayfirst=False)
# Standardize text fields
df['name'] = df['name'].str.strip().str.title()
df['email'] = df['email'].str.strip().str.lower()
# Standardize phone numbers (basic)
df['phone'] = df['phone'].str.replace(r'[^0-9+]', '', regex=True)
6. Problemas de Tipos de Dados
O CSV armazena tudo como texto. Números com zeros à esquerda, códigos postais e números de telefone podem perder a formatação quando analisados:
# Preserve leading zeros in zip codes
df = pd.read_csv('data.csv', dtype={'zip_code': str, 'phone': str})
# Convert currency strings to numbers
df['price'] = df['price'].str.replace('$', '').str.replace(',', '').astype(float)
Validação Após Limpeza
Valide sempre os seus dados limpos:
# Check row count (did we lose or gain rows unexpectedly?)
print(f"Rows: {len(df)}")
# Check data types
print(df.dtypes)
# Check value ranges
print(df.describe())
# Check for remaining nulls
print(df.isnull().sum())
# Validate unique constraints
assert df['email'].is_unique, "Duplicate emails found!"
Ferramentas de Linha de Comandos
Para limpeza rápida sem escrever código:
# Convert encoding
iconv -f WINDOWS-1252 -t UTF-8 input.csv > output.csv
# Sort and remove duplicate lines
sort -u input.csv > output.csv
# Extract specific columns (cut)
cut -d',' -f1,3,5 input.csv > output.csv
# Filter rows (awk)
awk -F',' '$3 > 100' input.csv > filtered.csv
Para transformações mais complexas, ferramentas como o csvkit fornecem um conjunto completo de utilitários CSV:
# Install
pip install csvkit
# View column names
csvcut -n data.csv
# Filter rows
csvgrep -c country -m "USA" data.csv > usa_only.csv
# Convert to JSON
csvjson data.csv > data.json
Converter entre CSV e JSON? O nosso conversor CSV para JSON trata disto instantaneamente.
FAQ
Qual é o tamanho máximo de ficheiro para processamento de CSV?
Não existe um limite inerente no formato CSV. O limite prático depende das suas ferramentas: o Excel processa cerca de 1 milhão de linhas, o pandas funciona bem até vários GB com RAM adequada, e ferramentas como Dask ou Polars processam conjuntos de dados maiores do que a memória. Para ferramentas baseadas no navegador, o nosso editor de CSV processa ficheiros até 100MB.
Devo utilizar CSV ou JSON para troca de dados?
O CSV é melhor para dados planos e tabulares (folhas de cálculo, exportações de bases de dados, listas simples). O JSON é melhor para dados aninhados e hierárquicos (respostas de API, configuração, documentos com estrutura variável). Para uma comparação detalhada, consulte o nosso guia CSV vs JSON vs XML.
Recursos Relacionados
- Editor de CSV — Edite e limpe dados CSV no seu navegador
- Guia de Conversão CSV para JSON — Converta entre formatos
- Boas Práticas de Formatação JSON — Trabalhe com a saída JSON