alltools.one
Data
2025-07-01
8 min
alltools.one Team
CSVData CleaningData AnalysisETLPython

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

Published on 2025-07-01
CSV Data Cleaning Tips for Analysts and Developers | alltools.one