Skip to content

Map (Script C#)

O processador Map é um nó de scripting avançado que permite escrever código C# puro para manipular, transformar, filtrar ou gerar dados. Ele oferece controle total sobre o fluxo de dados, permitindo lógicas que não são possíveis com nós padrão.

Como Funciona

O Horus compila seu código C# em tempo de execução (usando Roslyn) e o injeta dentro de um método executável no pipeline de dados.

Assinatura do Método

O código que você escreve é o corpo do seguinte método:

csharp
public DataList Run(DataList input, ETLLogger logger, DataList input0, ...)
{
    // SEU CÓDIGO AQUI
}

API de Scripting

Para usar este nó efetivamente, você interage com as seguintes classes do motor ETL:

1. DataList (Entrada e Saída)

Representa o fluxo de dados (tabela).

  • Comportamento: É um IEnumerable<DataRow>. Você pode iterar sobre ele com foreach
  • Schema: Possui metadados das colunas (input.GetSchema())

2. DataRow (Linha)

Representa uma linha de dados.

  • Acesso por Coluna: Use o indexador de string para ler ou escrever valores:
    csharp
    var valor = linha["NOME_DA_COLUNA"];
    linha["OUTRA_COLUNA"] = 123;
  • Tipagem: Os valores são objetos (object). Use a classe Helpers para conversão segura (Helpers.ToDouble(), Helpers.ToDate())

3. Logger

Permite escrever mensagens no log de execução, visíveis na tela.

  • logger.Log("Mensagem"): Escreve uma linha no log

Exemplos de Código

Exemplo 1: Transformação Simples (Update)

Itera sobre as linhas recebidas e altera o valor de uma coluna existente. Ideal para correções pontuais.

csharp
// Itera sobre cada linha do input
foreach(var linha in input)
{
  // Lê coluna "NUMERO", multiplica por 2 e salva na coluna "RESULTADO"
  // Nota: A coluna "RESULTADO" deve existir previamente no fluxo
  linha["RESULTADO"] = Helpers.ToDouble(linha["NUMERO"]) * 2;
}

// Retorna o mesmo DataList modificado
return input;

Exemplo 2: Criação de Novos Dados (Novo Schema)

Cria uma estrutura de dados totalmente nova e gera linhas programaticamente. Ideal para normalização, explosão de linhas ou criação de dados sintéticos.

csharp
// 1. Defina o schema (colunas e tipos) da saída
var schema = DataSchema.Create(@"
    ID NUMBER
    NOME STRING
    DATA_CRIACAO DATE
");

// 2. Crie uma função geradora (yield return) para performance (Lazy Loading)
// Isso evita carregar tudo na memória de uma vez
IEnumerable<DataRow> GerarDados()
{
    int i = 0;
    foreach(var linhaOriginal in input)
    {
        i++;
        // Log a cada 10.000 linhas para acompanhar progresso
        if (i % 10000 == 0) logger.Log($"Processado {i:N0} linhas...");

        // Cria uma nova linha vazia com o schema definido
        var dr = new DataRow(schema);

        // Preenche os valores
        dr["ID"] = i;
        dr["NOME"] = linhaOriginal["NOME_COMPLETO"].ToString().ToUpper();
        dr["DATA_CRIACAO"] = DateTime.Now;

        // Entrega a linha para o próximo passo do fluxo
        yield return dr;
    }
}

// 3. Retorna um novo DataList usando o gerador e o schema
return new DataList(GerarDados(), schema);

WARNING

Use com Moderação O nó Map é poderoso, mas requer conhecimento de C#.

  • Para transformações simples (filtros, cálculos matemáticos, renomear colunas), prefira usar o nó SQL (DuckDB) ou Python, que são mais concisos e fáceis de manter.
  • Erros no script C# podem parar todo o fluxo de dados.