2008-10-02 25 views
17

Tengo un archivo de texto lleno de registros donde cada campo en cada registro tiene un ancho fijo. Mi primer enfoque sería analizar cada registro simplemente usando string.Substring(). ¿Hay una mejor manera?Leer el registro de ancho fijo desde el archivo de texto

Por ejemplo, el formato podría ser descrito como:

<Field1(8)><Field2(16)><Field3(12)> 

Y un ejemplo de archivo con dos registros podría parecerse a:

SomeData000000000SomeMoreData 
Data2 0000000000555555MoreData  

sólo quiero asegurarme de que no estoy pasando por alto una forma más elegante que Substring().


Actualización: que en última instancia, fui con una expresión regular como Killersponge sugirió:

private readonly Regex reLot = new Regex(REGEX_LOT, RegexOptions.Compiled); 
const string REGEX_LOT = "^(?<Field1>.{6})" + 
         "(?<Field2>.{16})" + 
         "(?<Field3>.{12})"; 

entonces utilizo el siguiente para acceder a los campos:

Match match = reLot.Match(record); 
string field1 = match.Groups["Field1"].Value; 

Respuesta

5

Subcadena suena bien para mí. El único inconveniente que puedo pensar inmediatamente es que significa copiar los datos cada vez, pero no me preocuparé hasta que demuestres que se trata de un cuello de botella. Subcadena es simple :)

podría utilizar una expresión regular para que coincida con un registro completo a la vez y capturar los campos, pero creo que sería exagerado.

+0

Sí, traté de pensar en una forma de usar una expresión regular, pero creo que es la herramienta incorrecta para el trabajo y, como dijiste, excesivo. –

+0

regex?^(. {8}) (. {16}) (. *) $ Para la definición de campos anterior, suponiendo que el último campo puede rellenarse o no con espacios. – Sekhat

1

No, Subcadena está bien . Para eso es para eso.

2

Es posible que tenga que prestar atención, si el final de las líneas no están rellenas con espacios para llenar el campo, su subcadena no funcionará sin un poco de manipulación para calcular cuánto más de la línea existe es leer Esto, por supuesto, solo se aplica al último campo :)

21

Use FileHelpers.

Ejemplo:

[FixedLengthRecord()] 
public class MyData 
{ 
    [FieldFixedLength(8)] 
    public string someData; 

    [FieldFixedLength(16)] 
    public int SomeNumber; 

    [FieldFixedLength(12)] 
    [FieldTrim(TrimMode.Right)] 
    public string someMoreData; 
} 

Entonces, es tan simple como esto:

var engine = new FileHelperEngine<MyData>(); 

// To Read Use: 
var res = engine.ReadFile("FileIn.txt"); 

// To Write Use: 
engine.WriteFile("FileOut.txt", res); 
+0

Necesito algunos genéricos, tal vez debería echarle un vistazo y hacerlo: P – Sekhat

+0

o no, parece que ya se ha hecho: P – Sekhat

+2

-1 para solución dependiente de biblioteca externa, subóptima. –

1

Puede configurar una fuente de datos ODBC para el archivo de formato fijo y luego acceder a ella como cualquier otra tabla de base de datos. Esto tiene la ventaja adicional de que el conocimiento específico del formato de archivo no se compila en su código para ese fatídico día en que alguien decide colocar un campo adicional en el medio.

Cuestiones relacionadas