-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathProgram.cs
153 lines (130 loc) · 6.19 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using Npgsql;
using NpgsqlTypes;
namespace ETLDespesasDeputados
{
class Program
{
static void Main(string[] args)
{
var registros = Compressao.Conteudo(new FileInfo(Parametros.Arquivo));
Console.WriteLine("Obtendo deputados únicos");
var deputadosUnicos = ValoresUnicos(registros, r => r.nome_deputado);
Console.WriteLine("Obtendo partidos únicos");
var partidosUnicos = ValoresUnicos(registros, r => r.sg_partido);
Console.WriteLine("Obtendo UFs únicos");
var ufsUnicas = ValoresUnicos(registros, r => r.sg_uf);
Console.WriteLine("Obtendo tipos únicos");
var tiposUnicos = ValoresUnicos(registros, r => r.desc_tipo);
var connString = $"Host={Parametros.Host};Username={Parametros.Username};Password={Parametros.Password};Database={Parametros.Database}";
var dimensoesPorNome = new Dictionary<string, Dictionary<string, int>> {
{ "deputado", deputadosUnicos },
{ "uf", ufsUnicas },
{ "partido", partidosUnicos },
{ "tipo", tiposUnicos }
};
var camposDescricaoPorDimensao = new Dictionary<string, string>
{
{"deputado", "nome_deputado"},
{"uf", "sg_uf"},
{"partido", "sg_partido"},
{"tipo", "desc_tipo"}
};
using (var conn = new NpgsqlConnection(connString))
{
conn.Open();
foreach (var dimensao in dimensoesPorNome.Keys)
{
var nomeTabelaDimensao = $"dim_{dimensao}";
LimparTabela(conn, nomeTabelaDimensao);
Console.WriteLine($"Inserindo registros na tabela {nomeTabelaDimensao}");
using (var writer = conn.BeginBinaryImport($"COPY {nomeTabelaDimensao} (cod_{dimensao}, {camposDescricaoPorDimensao[dimensao]}) FROM STDIN (FORMAT BINARY)"))
{
foreach (var valores in dimensoesPorNome[dimensao])
{
writer.StartRow();
writer.Write(valores.Value, NpgsqlDbType.Integer);
writer.Write(valores.Key, NpgsqlDbType.Varchar);
}
writer.Complete();
}
}
LimparTabela(conn, "dim_data");
Console.WriteLine($"Inserindo registros na tabela dim_data");
using (var writer = conn.BeginBinaryImport($"COPY dim_data (cod_data, dia_mes, dia_semana, nome_dia_semana, mes, nome_mes, ano, txt_data, vl_data) FROM STDIN (FORMAT BINARY)"))
{
var dataAtual = Parametros.DataInicio;
var id = 1;
do
{
writer.StartRow();
writer.Write(id++, NpgsqlDbType.Integer);
writer.Write(dataAtual.Day, NpgsqlDbType.Integer);
writer.Write(((int)dataAtual.DayOfWeek) + 1, NpgsqlDbType.Integer);
writer.Write(dataAtual.ToString("dddd", Parametros.CultureInfo), NpgsqlDbType.Varchar);
writer.Write(dataAtual.Month, NpgsqlDbType.Integer);
writer.Write(dataAtual.ToString("MMMM", Parametros.CultureInfo), NpgsqlDbType.Varchar);
writer.Write(dataAtual.Year, NpgsqlDbType.Integer);
writer.Write(dataAtual.ToString("yyyy-MM-dd HH:mm:ss"), NpgsqlDbType.Varchar);
writer.Write(dataAtual, NpgsqlDbType.Date);
dataAtual = dataAtual.AddDays(1);
}
while (dataAtual <= Parametros.DataFim);
writer.Complete();
}
LimparTabela(conn, "fato_despesas");
Console.WriteLine($"Inserindo registros na tabela fato_despesas");
using (var writer = conn.BeginBinaryImport($"COPY fato_despesas (cod_tipo, cod_deputado, cod_partido, cod_uf, dt_despesa, vl_despesa) FROM STDIN (FORMAT BINARY)"))
{
foreach (var registro in registros)
{
writer.StartRow();
writer.Write(tiposUnicos[registro.desc_tipo], NpgsqlDbType.Integer);
writer.Write(deputadosUnicos[registro.nome_deputado]);
writer.Write(partidosUnicos[registro.sg_partido]);
writer.Write(ufsUnicas[registro.sg_uf]);
if (registro.dt_despesa == null)
{
writer.WriteNull();
}
else
{
writer.Write(registro.dt_despesa.Value, NpgsqlDbType.Date);
}
if (registro.vl_despesa == null)
{
writer.WriteNull();
}
else
{
writer.Write(registro.vl_despesa.Value, NpgsqlDbType.Money);
}
}
writer.Complete();
}
}
}
private static void LimparTabela(NpgsqlConnection conn, string nome)
{
Console.WriteLine($"Limpando tabela {nome}");
using (var cmd = new NpgsqlCommand())
{
cmd.Connection = conn;
cmd.CommandText = $"TRUNCATE TABLE {nome}";
cmd.ExecuteNonQuery();
}
}
static Dictionary<string, int> ValoresUnicos(IEnumerable<Origem> registros, Func<Origem, string> field)
{
int i = 0;
return registros.Select(field)
.Distinct()
.OrderBy(r => r)
.ToDictionary(k => k, v => ++i);
}
}
}