CnabAnalizeScore 0.1.1
dotnet add package CnabAnalizeScore --version 0.1.1
NuGet\Install-Package CnabAnalizeScore -Version 0.1.1
<PackageReference Include="CnabAnalizeScore" Version="0.1.1" />
<PackageVersion Include="CnabAnalizeScore" Version="0.1.1" />
<PackageReference Include="CnabAnalizeScore" />
paket add CnabAnalizeScore --version 0.1.1
#r "nuget: CnabAnalizeScore, 0.1.1"
#:package CnabAnalizeScore@0.1.1
#addin nuget:?package=CnabAnalizeScore&version=0.1.1
#tool nuget:?package=CnabAnalizeScore&version=0.1.1
🏦 CnabAnalizeScore
Biblioteca .NET para análise e validação de layouts CNAB (Centro Nacional de Automação Bancária) com algoritmos de similaridade inteligente para mapeamento automático de campos.
📋 Índice
- Sobre
- Características
- Instalação
- Uso Rápido
- Conceitos
- Exemplos Avançados
- Layouts Disponíveis
- API
- Contribuindo
🎯 Sobre
CnabAnalizeScore é uma biblioteca que facilita a integração e validação de arquivos CNAB, permitindo que você:
- 🔍 Analise layouts CNAB comparando campos de entrada com templates pré-configurados
- 🎯 Calcule scores de similaridade entre nomes de campos usando múltiplos algoritmos (Levenshtein, similaridade textual, compatibilidade de tipos)
- 📊 Obtenha relatórios detalhados com percentuais de match e compatibilidade
- 🔄 Compare múltiplos layouts automaticamente e escolha o melhor match
Ideal para sistemas que precisam importar dados de diferentes fontes (Excel, CSV, APIs) e mapeá-los para o formato CNAB de forma inteligente e automática.
✨ Características
- ✅ Matching inteligente de campos usando algoritmos de similaridade textual
- ✅ Suporte a múltiplos layouts CNAB (400, 444, etc.)
- ✅ Cálculo automático de score de compatibilidade
- ✅ Validação de tipos de dados (texto, número, decimal)
- ✅ Análise de múltiplos layouts simultaneamente
- ✅ Relatórios detalhados com estatísticas de match
- ✅ Extensível - fácil adicionar novos layouts e algoritmos
📦 Instalação
Via NuGet Package Manager
Install-Package CnabAnalizeScore
Via .NET CLI
dotnet add package CnabAnalizeScore
Via PackageReference (no .csproj)
<PackageReference Include="CnabAnalizeScore" Version="1.0.0" />
🚀 Uso Rápido
Exemplo Básico
using CnabAnalizeScore.Core.CnabAnalize;
using CnabAnalizeScore.Core.CnabTemplates;
// 1. Definir os campos de entrada (vindos do seu Excel, CSV, API, etc.)
var camposEntrada = new[]
{
"Seu Numero",
"Numero Documento",
"Data Vencimento",
"Valor do Titulo",
"Nome do Sacado",
"CPFCNPJ"
};
// 2. Criar o template do layout CNAB que deseja analisar
var cnab400 = Cnab400Template.Create();
// 3. Criar o analisador e executar
var matcher = new CnabLayoutMatcher();
var resultado = matcher.AnalisarLayout(cnab400, camposEntrada);
// 4. Verificar compatibilidade
if (resultado.IsCompativel)
{
Console.WriteLine($"✅ Layout compatível!");
Console.WriteLine($"📊 Percentual de match: {resultado.PercentualMatch:P1}");
Console.WriteLine($"⭐ Score médio: {resultado.ScoreMedio:P1}");
// Listar campos mapeados
foreach (var field in resultado.Fields)
{
Console.WriteLine($" {field.NomeCampoOrigem} ← {field.NomeCampoDestino} ({field.Score:P0})");
}
}
else
{
Console.WriteLine("❌ Layout não compatível");
}
Saída Exemplo
✅ Layout compatível!
📊 Percentual de match: 85.7%
⭐ Score médio: 92.3%
SeuNumero ← Seu Numero (100%)
NumeroDocumento ← Numero Documento (100%)
DataVencimento ← Data Vencimento (100%)
ValorTitulo ← Valor do Titulo (95%)
NomeSacado ← Nome do Sacado (98%)
CPF_CNPJ ← CPFCNPJ (90%)
💡 Conceitos
Score de Similaridade
O score varia de 0.0 a 1.0 (0% a 100%) e indica o quão similar é o nome do campo de entrada com o campo do layout CNAB. O cálculo considera:
- Similaridade Textual: Compara as strings usando distância de Levenshtein
- Palavras-chave: Verifica sinônimos e variações pré-configuradas
- Compatibilidade de Tipo: Valida se os tipos de dados são compatíveis
Score de Rejeição
Cada layout possui um score de rejeição (padrão: 0.3 ou 30%). Campos com score abaixo deste valor são descartados do resultado.
// Exemplo: Layout com score de rejeição de 40%
var layout = Cnab400Template.Create(); // ScoreRejeicao = 0.3 (30%)
Resultado da Análise
O objeto LayoutMatchResult contém:
| Propriedade | Descrição |
|---|---|
TypeLayout |
Nome do layout analisado |
IsCompativel |
Indica se o layout é compatível com os campos de entrada |
PercentualMatch |
Percentual de campos do CNAB que foram mapeados |
ScoreMedio |
Score médio de todos os matches |
ScoreMax / ScoreMin |
Maior e menor score encontrado |
TotalCamposMatched |
Quantidade de campos matched com sucesso |
TotalCamposCnab |
Quantidade total de campos no layout |
Fields |
Lista detalhada de cada campo mapeado |
📚 Exemplos Avançados
Analisar Múltiplos Layouts
Quando você não sabe qual layout usar, pode analisar vários e obter o melhor match:
// Criar lista de layouts para testar
var layouts = new List<BaseTemplate>
{
Cnab400Template.Create(),
Cnab444Template.Create()
};
// Analisar todos e retornar o melhor
var matcher = new CnabLayoutMatcher();
var melhorResultado = matcher.AnalisarMelhoresLayouts(layouts, camposEntrada);
Console.WriteLine($"🏆 Melhor layout: {melhorResultado.TypeLayout}");
Console.WriteLine($"📊 Score: {melhorResultado.ScoreMedio:P1}");
Filtrar Campos por Score
var resultado = matcher.AnalisarLayout(cnab400, camposEntrada);
// Obter apenas matches com score acima de 80%
var matchesAltos = resultado.Fields
.Where(f => f.Score >= 0.8f)
.OrderByDescending(f => f.Score)
.ToList();
foreach (var match in matchesAltos)
{
Console.WriteLine($"✅ {match.NomeCampoDestino} → {match.NomeCampoOrigem} " +
$"(Score: {match.Score:P1})");
}
Identificar Campos Não Mapeados
var resultado = matcher.AnalisarLayout(cnab400, camposEntrada);
// Campos de entrada que não foram mapeados
var camposNaoMapeados = camposEntrada
.Where(campo => !resultado.Fields.Any(f => f.NomeCampoDestino == campo))
.ToList();
if (camposNaoMapeados.Any())
{
Console.WriteLine("⚠️ Campos não mapeados:");
foreach (var campo in camposNaoMapeados)
{
Console.WriteLine($" • {campo}");
}
}
Validar Compatibilidade Mínima
const float PERCENTUAL_MINIMO = 0.7f; // 70%
var resultado = matcher.AnalisarLayout(cnab400, camposEntrada);
if (resultado.PercentualMatch >= PERCENTUAL_MINIMO)
{
Console.WriteLine("✅ Layout validado! Pode prosseguir com a importação.");
}
else
{
Console.WriteLine($"❌ Layout incompatível. Necessário {PERCENTUAL_MINIMO:P0}, " +
$"encontrado apenas {resultado.PercentualMatch:P0}");
}
📋 Layouts Disponíveis
CNAB 400
Layout CNAB 400 - Remessa
var cnab400 = Cnab400Template.Create();
// Score de rejeição: 30%
// Template genérico CNAB 400 - Remessa
// Campos: SeuNumero, NumeroDocumento, NossoNumero, DataEmissao,
// DataVencimento, ValorTitulo, CPF_CNPJ, NomeSacado, etc.
Campos principais:
SeuNumero: Número de controle do participanteNumeroDocumento: Número do documento de cobrançaNossoNumero: Identificação do título no bancoDataEmissao/DataVencimento: Datas em formato DDMMAAValorTitulo: Valor nominal (decimal com 2 casas)CPF_CNPJ: Documento do sacadoNomeSacado: Nome do pagadorEndereco,Numero,Bairro,Cidade,UF,CEPValorJurosDia,ValorMulta,DiasProtestoMensagem1,Mensagem2: Instruções/observações
CNAB 444
Layout CNAB 444 - Remessa - Cessão de Crédito / FIDC
var cnab444 = Cnab444Template.Create();
// Score de rejeição: 35%
// Template CNAB 444 - Cessão de Crédito / FIDC
// Campos: SeuNumero, NumeroTitulo, ChaveNFe, NumeroNFe, etc.
Campos principais:
SeuNumero: Número de controle do participanteNumeroTitulo: Número do título/duplicataChaveNFe: Chave de acesso da NF-e (44 dígitos)NumeroNFe,SerieNFe: Dados da nota fiscalDataEmissaoNFe: Data de emissão da NF-e (DDMMAAAA)ValorNFe: Valor total da nota fiscalDataVencimento: Data de vencimento (DDMMAAAA)ValorNominal: Valor nominal do títuloCPF_CNPJ_Sacado,RazaoSocial: Dados do sacadoCPF_CNPJ_Cedente: Documento do cedente
Criar seu Próprio Layout
public class MeuLayoutCustom : BaseTemplate
{
private MeuLayoutCustom() : base("MeuLayout", scoreRejeicao: 0.3f)
{
InitializeFields();
}
public static MeuLayoutCustom Create() => new MeuLayoutCustom();
private void InitializeFields()
{
var fields = new List<FieldCnab>();
fields.Add(new FieldCnab(
name: "CodigoCliente",
typeField: "NUMERO",
startPosition: 1,
endPosition: 10,
length: 10,
similarity: new FieldSimilarity(new[] {
"Codigo Cliente",
"CodCliente",
"Id Cliente"
}),
description: "Código único do cliente"
));
// Adicionar mais campos...
fieldCnabs = fields;
}
}
🔧 API
CnabLayoutMatcher
Classe principal para análise de layouts.
Métodos
AnalisarLayout(BaseTemplate layout, string[] camposEntrada)
- Analisa um único layout CNAB
- Parâmetros:
layout: Template do layout (ex:Cnab400Template.Create())camposEntrada: Array com nomes dos campos a comparar
- Retorna:
LayoutMatchResultcom o resultado completo - Exceções:
ArgumentNullException: Selayoutfor nuloArgumentException: SecamposEntradafor nulo ou vazio
AnalisarMelhoresLayouts(List<BaseTemplate> layouts, string[] camposEntrada)
- Analisa múltiplos layouts e retorna o melhor match
- Parâmetros:
layouts: Lista de templates para analisarcamposEntrada: Array com nomes dos campos a comparar
- Retorna:
LayoutMatchResultdo layout mais compatível - Exceções:
ArgumentException: Selayoutsfor nulo ou vazio
LayoutMatchResult
Resultado da análise de um layout.
Propriedades
| Propriedade | Tipo | Descrição |
|---|---|---|
TypeLayout |
string |
Nome do layout analisado |
Fields |
List<FieldMatchResult> |
Lista de campos matched |
ScoreMedio |
float |
Score médio (0.0 a 1.0) |
ScoreMax |
float |
Maior score encontrado |
ScoreMin |
float |
Menor score encontrado |
ScoreRejeicao |
float |
Score de corte para rejeição |
TotalCamposMatched |
int |
Quantidade de campos matched |
TotalCamposCnab |
int |
Total de campos no layout |
PercentualMatch |
float |
Percentual de campos matched (0.0 a 1.0) |
IsCompativel |
bool |
Se o layout é compatível |
FieldMatchResult
Resultado do match de um campo específico.
Propriedades
| Propriedade | Tipo | Descrição |
|---|---|---|
NomeCampoOrigem |
string |
Nome do campo no layout CNAB |
NomeCampoDestino |
string |
Nome do campo de entrada |
Score |
float |
Score de similaridade (0.0 a 1.0) |
IsValid |
bool |
Se o match foi aceito |
TypeField |
string |
Tipo do campo (TEXTO, NUMERO, DECIMAL) |
StartPosition |
int |
Posição inicial no arquivo CNAB |
EndPosition |
int |
Posição final no arquivo CNAB |
Length |
int |
Tamanho do campo |
BaseTemplate
Classe base para todos os layouts CNAB.
Propriedades
| Propriedade | Tipo | Descrição |
|---|---|---|
Name |
string |
Nome do layout |
ScoreRejeicao |
float |
Score mínimo para aceitar matches (padrão: 0.3) |
fieldCnabs |
IEnumerable<FieldCnab> |
Lista de campos do layout |
FieldCnab
Estrutura que representa um campo no layout CNAB.
Construtor
FieldCnab(
string name,
string typeField, // "TEXTO", "NUMERO", "DECIMAL"
int startPosition,
int endPosition,
int length,
FieldSimilarity similarity,
string description = ""
)
FieldSimilarity
Define sinônimos e variações para o campo.
new FieldSimilarity(new[] {
"Nome Principal",
"Variacao 1",
"Variação 2",
"Nome_Alternativo"
})
🛠️ Casos de Uso
1. Importação de Planilhas Excel
// Ler cabeçalhos da planilha
var colunas = ObterColunasExcel("arquivo.xlsx");
// Validar compatibilidade com CNAB
var matcher = new CnabLayoutMatcher();
var resultado = matcher.AnalisarLayout(Cnab400Template.Create(), colunas);
if (resultado.IsCompativel)
{
// Criar mapeamento para importação
var mapeamento = resultado.Fields.ToDictionary(
f => f.NomeCampoDestino, // Coluna do Excel
f => f.NomeCampoOrigem // Campo do CNAB
);
// Usar mapeamento para importar dados
ImportarDados(mapeamento);
}
2. Validação de APIs de Integração
// Receber JSON de API externa
var camposApi = JsonSerializer.Deserialize<string[]>(jsonResponse);
// Verificar se a API retorna os campos necessários
var resultado = matcher.AnalisarLayout(cnab400, camposApi);
if (resultado.PercentualMatch < 0.8f)
{
throw new InvalidOperationException(
$"API incompatível. Necessário 80%, encontrado {resultado.PercentualMatch:P0}"
);
}
3. Detecção Automática de Layout
// Quando não sabe qual layout usar
var todosLayouts = new List<BaseTemplate>
{
Cnab400Template.Create(),
Cnab444Template.Create(),
// ... outros layouts
};
var melhor = matcher.AnalisarMelhoresLayouts(todosLayouts, camposUsuario);
Console.WriteLine($"Layout detectado automaticamente: {melhor.TypeLayout}");
🤝 Contribuindo
Contribuições são bem-vindas! Para adicionar novos layouts ou melhorias:
- Fork o repositório
- Crie uma branch para sua feature (
git checkout -b feature/NovoLayout) - Implemente suas mudanças
- Adicione testes
- Commit suas mudanças (
git commit -am 'Adiciona novo layout CNAB XXX') - Push para a branch (
git push origin feature/NovoLayout) - Abra um Pull Request
Adicionando um Novo Layout
- Crie uma nova classe herdando de
BaseTemplate - Implemente o método
InitializeFields() - Defina todos os campos com suas respectivas similaridades
- Adicione testes unitários
- Atualize a documentação
📄 Licença
Este projeto está licenciado sob a MIT License - veja o arquivo LICENSE para detalhes.
📞 Suporte
- 🐛 Issues: GitHub Issues
- 📧 Email: suporte@example.com
- 💬 Discussões: GitHub Discussions
🙏 Agradecimentos
- Baseado nas especificações oficiais FEBRABAN
- Inspirado nas necessidades reais de integração bancária
- Desenvolvido para a comunidade .NET brasileira
Feito com ❤️ para facilitar integrações CNAB no Brasil
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Versão inicial com suporte a CNAB 400 e 444. Compatível com .NET 8.0