简体   繁体   中英

C# Text File Input Multi-File Output

I have a file that looks something like this:

|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 |

I need to break the file up into multiple files based on the first 6 characters starting in position 2.

File 1 named 29923c.asc:

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

File 2 named 47422K.asc:

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

File 3 named 9875D.asc:

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

I don't know what will be in the file before the program gets it, just the format. The 6 digits will change depending on the customer. I don't know what they will be.

The only thing I know is the format.

Can anyone give me a suggestion as to how to dynamically obtain\\maintain this information so that I can parse it out into individual files?

I suggest using a parser such a the TextFieldParser class.

You could read the data into memory, sort it using the first field then write out individual files.

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   
}

Read line by line. Get code from each line and create file, put reference to opened file stream to dictionary with code as a key. On each next line check dictionary for the key and use opened stream or create new one. After reading all file close all streams.

This algorithm will prevent from using too much memory for a file lines if it has a big size.

For parsing each line you can simply use RegEx, for example.

You could do it the brute-force way.

Reading:

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);
}

Writing:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM