Importar archivo de texto con formato extraño en C #
Pregunta
Tengo este archivo exportado de un formato extraño (¡estándar para esta industria!), que necesito importar nuestra base de datos El archivo básicamente se ve así:
DATRKAKT-START
KAKT_LKZ "D"
KAKT_DAT_STAMM "1042665"
DATRKAIB-START
KAIB_AZ "18831025"
KAIB_STATUS_FM 2
KAIB_KZ_WAE "E"
DATRKAIB-END
DATRKARP-START
KARP_MELD "831025"
KARP_ST_MELD "G"
DATRKARP-END
...
DATRKAKT-END
Hay 56 secciones con un total de 1963 filas diferentes, por lo que realmente no estoy en creando 56 clases con propiedades de 1963 ... ¿Cómo manejarías este archivo? para que pueda acceder a alguna propiedad como si fuera un objeto?
Datrkaib.Kaib_Status_Fm
Datrkarp.karp_St_Meld
Solución
A menos que su lenguaje de programación le permita agregar métodos a las clases en tiempo de ejecución o que las clases respondan a llamadas a métodos indefinidos, no hay forma de que pueda hacer esto. La cuestión es que, incluso si C # le permitiera hacer esto, perdería la seguridad de los tipos y la ayuda de Intellisense de todos modos (presumiblemente entre las razones por las que desea que funcione así), entonces, ¿por qué no seguir adelante y leerlo en alguna estructura de datos? Mi inclinación sería un hash que puede contener valores u otros hash, por lo que recibiría llamadas como (VB):
Datrkakt("Lkz")
Datrkakt("Dat_Stam")
Datrkakt("Kaib")("Az")
Datrkakt("Kaib")("Status_Fm")
O si sabe que todos los elementos de datos tienen un nombre exclusivo como en su ejemplo, simplemente use un hash:
Datr("Kakt_Lkz")
Datr("Kakt_Dat_Stam")
Datr("Kaib_Az")
Datr("Kaib_Status_Fm")
Puede recuperar la ayuda de Intellisense creando una enumeración de todos los nombres de elementos de datos y obteniendo:
Datr(DatrItem.KAKT_LKZ)
Datr(DatrIrem.KAIB_STATUS_FM)
Otros consejos
Parece datos estructurados: ejecutaría la búsqueda, la reemplazaría y la convertiría en un simple xml. y luego importar.
Si desea generar un archivo de código a partir de él, considere codesmith - Creo que puede hacer esto.
Iría con una Lista <name, list>
de varios objetos, que puede ser una tupla <name, value>
o una lista de objetos con nombre.
No hay nada que haga esto automáticamente por usted.
Crearía una clase que contenga todas las propiedades apropiadas (por ejemplo, DatrDocument), y crearía una clase DatrReader (idea similar a las clases XmlDocument / XmlReader).
El DatrReader deberá leer el contenido del archivo o la secuencia y analizarlo en un DatrDocument.
También es posible que desee escribir una clase DatrWriter que tomará un DatrDocument y lo escribirá en una secuencia.