Cómo utilizar ChoETL para comparar dos archivos CSV en busca de registros AÑADIDOS, CAMBIADOS o ELIMINADOS (Maestro vs Detalles)?
He estado jugando con el fantástico sistema ETL de C# de @Cinchoo. Necesito comparar dos archivos CSV, donde uno de ellos se define como una tabla maestra que crece de manera dinámica y el otro como una tabla “detalle” de “alimentador”.
La tabla detalle puede tener diferencias en términos de registros NUEVOS, registros CAMBIADOS o registros que ya no existen (BORRADOS) en el archivo CSV maestro.
La salida debe ser una tercera tabla que reemplace o actualice la tabla maestra, por lo que es un archivo CSV en crecimiento.
Ambas tablas tienen columnas de ID únicas y una fila de encabezado.
CSV MAESTRO
ID,nombre
1,Danny
2,Fred
3,Sam
DETALLE
ID,nombre
1,Danny
<– el registro ya no existe
3,Pamela <– cambio de nombre
4,Fernando <– nuevo registro
Hasta ahora me he referido a esta muestra, y al siguiente código:
using System; using ChoETL; using System.Linq;
public class Program { public static void Main() { var input1 = ChoCSVReader.LoadText(csv1).WithFirstLineHeader().ToArray(); var input2 = ChoCSVReader.LoadText(csv2).WithFirstLineHeader().ToArray();
Console.WriteLine(“REGISTROS NUEVOS\n”); using (var output = new ChoCSVWriter(Console.Out).WithFirstLineHeader()) { output.Write(input2.OfType
Console.WriteLine(“\n\nREGISTROS BORRADOS\n”); using (var output = new ChoCSVWriter(Console.Out).WithFirstLineHeader()) { output.Write(input1.OfType
Console.WriteLine(“\n\nREGISTROS CAMBIADOS\n”); using (var output = new ChoCSVWriter(Console.Out).WithFirstLineHeader()) { output.Write(input1.OfType
static string csv1 = @” ID,nombre 1,Danny 2,Fred 3,Sam”;
static string csv2 = @"
ID,nombre
1,Danny
3,Pamela
4,Fernando”;
}
SALIDA
REGISTROS NUEVOS
ID,nombre
4,Fernando
REGISTROS BORRADOS
ID,nombre
2,Fred
REGISTROS CAMBIADOS
ID,nombre
Actualmente, los registros CAMBIADOS no están funcionando. Como una adición extra, necesito un estado, por lo que quiero que se vea así:
REGISTROS CAMBIADOS:
ID,nombre,estado
1,Danny,SIN CAMBIOS
2,Fred,BORRADO
3,Pamela,CAMBIADO
4,Fernando,NUEVO
Gracias
davy.ai
Solución para Comparar y Actualizar el CSV Maestro con el CSV de Detalle en C# usando ChoETL
Para resolver este problema, podemos utilizar la librería
ChoETL
en C# para leer y escribir archivos CSV. Aquí están los pasos que podemos seguir:ChoCSVReader
.Except
de LINQ, basado en la columna únicaID
.ChoCSVWriter
.estado
al archivo CSV de salida basado en si el registro esNUEVO
,CAMBIADO
oELIMINADO
.Aquí está el código actualizado basado en el fiddle proporcionado:
El código anterior produce la siguiente salida:
¡Espero que esto ayude!