2011-05-21 8 views
6

Tengo un archivo que se ve algo como esto:C Input Output # Archivo de texto de múltiples archivos

|29923C|SomeGuy,NameHere1  |00039252|042311|Some Address Info Here | 
|47422K|SomeGuy,NameHere2  |00039252|042311|Some Address Info Here | 
|98753D|SomeGuy,NameHere3  |00039252|042311|Some Address Info Here | 
|29923C|SomeGuy,NameHere4  |00039252|042311|Some Address Info Here | 
|47422K|SomeGuy,NameHere5  |00039252|042311|Some Address Info Here | 

tengo que romper el archivo en varios archivos a partir de los 6 primeros caracteres que comienza en la posición 2.

29923c.asc

archivo llamado 1:

|29923C|SomeGuy,NameHere1  |00039252|042311|Some Address Info Here | 
|29923C|SomeGuy,NameHere4  |00039252|042311|Some Address Info Here | 

archivo llamado 47422K.asc 2:

|47422K|SomeGuy,NameHere5  |00039252|042311|Some Address Info Here | 
|47422K|SomeGuy,NameHere2  |00039252|042311|Some Address Info Here | 

archivo llamado 9875D.asc 3:

|98753D|SomeGuy,NameHere3  |00039252|042311|Some Address Info Here | 

No sé lo que va a estar en el archivo antes de que el programa lo consigue, sólo el formato. Los 6 dígitos cambiarán según el cliente. No sé lo que serán.

Lo único que sé es el formato.

¿Puede alguien darme una sugerencia en cuanto a cómo obtener \ mantener esta información de modo que pueda analizar a cabo en archivos individuales de forma dinámica?

+0

¡me siento como un tonto. Yo era otro pensando de esta manera a mucha jaja. Gracias por la info! ¡La respuesta de todos funcionará y agradezco la ayuda! – ErocM

Respuesta

1

Leer línea por línea. Obtenga el código de cada línea y cree un archivo, ponga la referencia al flujo de archivos abierto en el diccionario con el código como clave. En cada línea siguiente, verifique el diccionario de la clave y use la secuencia abierta o cree una nueva. Después de leer todo el archivo, cierre todas las transmisiones.

Este algoritmo impedirá usar demasiada memoria durante líneas del archivo si tiene un gran tamaño.

Para analizar cada línea, simplemente puede usar RegEx, por ejemplo.

+1

Esta era la forma más sencilla de manejarlo. Leí una línea y luego la saqué al archivo en el que tenía que estar. Cada archivo que imprimí, lo agregué a un diccionario para que supiera lo que tenía que manejar una vez. – ErocM

4

sugiere emplear un analizador tal la clase TextFieldParser.

Se podía leer los datos en la memoria, clasificar usando el primer campo y luego escribir archivos individuales.

2
List<string> lines ; // load lines form file 

Dictionary<string,List<string>> dic = new Dictionary<string,List<string>>(); 
foreach(string line in lines) 
{ 
    string key = line.Split('|')[0]; 

    if(!dic.ContainsKey(key)) 
     dic.Add(key,new List<string>{line}); 
    else 
     dic[key].Add(line) 
} 

foreach(var pair in dic) 
{ 
    //create file and store there pair.Value 
} 
+0

¿Qué sucederá si un archivo tiene un tamaño muy grande? Todo almacenado en la memoria? –

+0

@archer ErocM no especificó que el archivo es muy grande – Stecya

+0

A lo sumo, podrían ser unas pocas líneas. – ErocM

0

Puedes hacerlo de la manera bruta.

lectura:

Dictionary<string, List<string>> DICT; 
Until End of File { 
    Read a line to LINE 
    Read characters 1-7 in LINE to CUSTOMERID 
    DICT[CUSTOMERID].Add(LINE); 
} 

Escritura:

foreach KeyValuePair entry in DICT { 
    Create file with name entry.Key 
    foreach string line in entry.Value { 
     Write line to file line 
    } 
} 
Cuestiones relacionadas