Для начала я хотел бы уточнить, что я не очень хорошо разбираюсь в 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 #, если такие вещи существуют.
Спасибо, что прочитали мой роман, дайте мне знать, если у вас возникнут проблемы с его пониманием. Я беру выходные, чтобы просмотреть этот дизайн, чтобы посмотреть, куплю ли я его, и хочу ли я приложить усилия, чтобы реализовать его таким образом.