Для начала хотелось бы уточнить, что я не очень хорошо разбираюсь в C #.В этом проекте, который я выполняю в C # с использованием .Net 3.5, я создаю класс для чтения и экспорта файлов, которые содержат несколько форматов фиксированной ширины на основе типа записи.
В настоящее время существует 5 типовзаписей, обозначенных первой символьной позицией в каждой строке файла, которые указывают конкретный формат строки.У меня проблема в том, что типы отличаются друг от друга.
Record type 1 has 5 columns, signifies beginning of the file
Record type 3 has 10 columns, signifies beginning of a batch
Record type 5 has 69 columns, signifies a transaction
Record type 7 has 12 columns, signifies end of the batch, summarizes
(these 3 repeat throughout the file to contain each batch)
Record type 9 has 8 columns, signifies end of the file, summarizes
Есть ли хорошая библиотека для таких файлов фиксированной ширины?Я видел несколько хороших, которые хотят загрузить весь файл как одну спецификацию, но это не сработает.
Примерно 250 из этих файлов читаются в конце каждого месяца и в среднем объединяют размер файласоставляет около 300 мегабайт.Эффективность очень важна для меня в этом проекте.
Основываясь на своих знаниях данных, я построил иерархию классов того, что, по моему мнению, должен выглядеть объект ...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Extract_Processing
{
class Extract
{
private string mFilePath;
private string mFileName;
private FileHeader mFileHeader;
private FileTrailer mFileTrailer;
private List<Batch> mBatches; // A file can have many batches
public Extract(string filePath)
{ /* Using file path some static method from another class would be called to parse in the file somehow */ }
public string ToString()
{ /* Iterates all objects down the heiarchy to return the file in string format */ }
public void ToFile()
{ /* Calls some method in the file parse static class to export the file back to storage somewhere */ }
}
class FileHeader
{ /* ... contains data types for all fields in this format, ToString etc */ }
class Batch
{
private string mBatchNumber; // Should this be pulled out of the batch header to make LINQ querying simpler for this data set?
private BatchHeader mBatchHeader;
private BatchTrailer mBatchTrailer;
private List<Transaction> mTransactions; // A batch can have multiple transactions
public string ToString()
{ /* Iterates through batches to return what the entire batch would look like in string format */ }
}
class BatchHeader
{ /* ... contains data types for all fields in this format, ToString etc */ }
class Transaction
{ /* ... contains data types for all fields in this format, ToString etc */ }
class BatchTrailer
{ /* ... contains data types for all fields in this format, ToString etc */ }
class FileTrailer
{ /* ... contains data types for all fields in this format, ToString etc */ }
}
Я упустил множество конструкторов и других методов, но я думаю, что идея должна быть довольно солидной.Я ищу идеи и критику к методам, которые я рассматриваю как еще раз, не знаю о C #, и время выполнения является наивысшим приоритетом.
Самый большой вопрос, помимо некоторой критики, как я должен внести этофайл?Я ввел много файлов на других языках, таких как VBA, используя методы FSO, Microsoft Access ImportSpec для чтения в файле (5 раз, по одному на каждую спецификацию ... вау, который был неэффективен!), Создал объект «Курсор» вVisual FoxPro (который был FAAAAAAAST, но опять же, должен был сделать пять раз), но я ищу скрытые драгоценные камни в C #, если указанные вещи существуют.
Спасибо за чтение моего романа, дайте мне знать, если у вас возникли проблемы с его пониманием.Я беру выходные, чтобы изучить этот дизайн и посмотреть, куплю ли я его и хочу ли он реализовать его таким образом.