Pregunta

Esencialmente, tengo que obtener un archivo plano en una base de datos. Los archivos planos vienen con los dos primeros caracteres en cada línea que indican qué tipo de registro es.

¿Creo una clase para cada tipo de registro con propiedades que coinciden con los campos en el registro? ¿Debo usar matrices?

Quiero cargar los datos en algún tipo de estructura de datos antes de guardarlos en la base de datos para poder usar pruebas unitarias para verificar que los datos se cargaron correctamente.

Aquí hay una muestra de lo que tengo que trabajar (extractos bancarios BAI2):

01,121000358,CLIENT,050312,0213,1,80,1,2/

02,CLIENT-STANDARD,BOFAGB22,1,050311,2359,,/

03,600812345678,GBP,fab1,111319005,,V,050314,0000/

88,fab2,113781251,,V,050315,0000,fab3,113781251,,V,050316,0000/

88,fab4,113781251,,V,050317,0000,fab5,113781251,,V,050318,0000/

88,010,0,,,015,0,,,045,0,,,100,302982205,,,400,302982205,,/

16,169,57626223,V,050311,0000,102 0101857345,/

88,LLOYDS TSB BANK PL 779300 99129797

88,TRF/REF 6008ABS12300015439

88,102 0101857345 K BANK GIRO CREDIT

88,/IVD-11 MAR

49,1778372829,90/

98,1778372839,1,91/

99,1778372839,1,92
¿Fue útil?

Solución

Recomiendo crear clases (o estructuras, o cualquier tipo de valor que su idioma admita), como

record.ClientReference

es mucho más descriptivo que

record[0]

y, si está utilizando la (¡maravillosa!) Biblioteca FileHelpers , sus términos son bonitos mucho dictado para ti.

Otros consejos

La lógica de validación generalmente tiene al menos 2 niveles, el nivel más grueso está "bien formateado" y el nivel más fino es "datos correctos".

Hay algunos problemas separados aquí. Un problema es simplemente verificar los datos o escribir pruebas para asegurarse de que su análisis sea preciso. Una manera simple de hacer esto es analizar en una clase que acepte un rango de valores dado y arroje el error apropiado si no,    p.ej.

public void setField1 (int i)    {         if (i > 100) arroja una nueva InvalidDataException ...    }

Crear diferentes clases para cada tipo de registro es algo que puede hacer si la lógica de análisis es significativamente diferente para diferentes códigos, por lo que no tiene una lógica condicional como

   public void setField2(String s)
   {
         if (field1==88 && s.equals ...

         else if (field2==22 && s 
   }

yechh.

Cuando tuve que cargar este tipo de datos en el pasado, lo puse todo en una tabla de trabajo con los dos primeros caracteres en un campo y el resto en otro. Luego lo analicé en las otras tablas de trabajo apropiadas basadas en los dos primeros caracteres. Luego he realizado cualquier limpieza y validación antes de insertar los datos del segundo conjunto de tablas de trabajo en la base de datos.

En SQL Server puede hacer esto a través de un DTS (2000) o un paquete SSIS y utilizando SSIS, puede procesar los datos sobre la marcha con el almacenamiento en tablas de trabajo primero, pero el proceso es similar, use el primero dos caracteres para determinar la rama de flujo de datos a usar, luego analizar el resto del registro en algún tipo de mecanismo de retención y luego limpiar y validar antes de insertar. Estoy seguro de que otras bases de datos también tienen algún tipo de mecanismo para importar datos y utilizarían un proceso similar.

Estoy de acuerdo en que si su formato de datos tiene algún tipo de complejidad, debe crear un conjunto de clases personalizadas para analizar y mantener los datos, realizar la validación y realizar cualquier otra tarea de modelo adecuada (por ejemplo, devolver una descripción legible por humanos, aunque algunos argumentarían que sería mejor ponerlo en una clase de vista separada). Probablemente sea una buena situación para usar la herencia, donde tiene una clase principal (posiblemente abstracta) que define las propiedades y métodos comunes a todos los tipos de registros, y cada clase secundaria puede anular estos métodos para proporcionar su propio análisis y validación si es necesario , o agregue sus propias propiedades y métodos.

Crear una clase para cada tipo de fila sería una mejor solución que usar Matrices.

Dicho esto, sin embargo, en el pasado he usado Arraylists of Hashtables para lograr lo mismo. Cada elemento de la lista de arrays es una fila, y cada entrada en la tabla hash es un par clave / valor que representa el nombre de la columna y el valor de la celda.

¿Por qué no comenzar diseñando la base de datos que contendrá los datos y luego puede usar el marco de la entidad para generar las clases por usted?

aquí hay una idea loca:

si estaba trabajando en Perl, podría usar DBD :: CSV para leer datos de su archivo plano, siempre que le haya dado los valores correctos para los caracteres separadores y EOL. luego leería las filas del archivo plano mediante declaraciones SQL; DBI los convertirá en estructuras de datos Perl estándar para usted, y puede ejecutar la lógica de validación que desee. una vez que cada fila pase todas las pruebas de validación, podrá escribirla en la base de datos de destino usando DBD :: lo que sea.

-steve

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top