создать объект со значениями его свойств из плоского файла, нужны идеи реализации - PullRequest
1 голос
/ 09 декабря 2010

Я получил плоский файл, в котором данные не разделены или что-то еще. Файл содержит одну большую строку, а одна строка представлена ​​180 символами.

Значение каждого столбца определяется длиной символов. Я должен создать объект для каждой строки, разобрать 180 символов и заполнить свойства созданного объекта с проанализированными значениями.

Как я могу решить эту проблему без постоянного использования подстроки или чего-то еще?

Может быть, какое-нибудь хорошее решение с Linq?

Большое спасибо.

Ответы [ 4 ]

1 голос
/ 09 декабря 2010

Решение 1 - Супер быстрая, но небезопасная:

  • Создайте свой класс с помощью [StructLayout(LayoutKind.Sequential)] и всех других неуправляемых маркировок кода для длины.Ваши строки будут массивом char, но после загрузки могут быть представлены в виде строки.
  • Прочитать 180 байтов и создать байтовый массив того же размера внутри fixed блока
  • Изменить указатель на IntPtr и используйте Marshal.PtrToStructure() для загрузки объекта вашего класса

Решение 2 - Загрузка логики в классе:

  • Создание конструктора вваш класс, который принимает byte[] и внутри объектов, используя Covenrt.Toxxx или Encoding.ASCII.ToString(), предполагая, что это ASCII
  • Прочитайте 180 байтов и создайте объект и передайте его .ctor
  • Если вынеобходимо выполнить сериализацию обратно до byte[], затем реализовать метод ToByteArray () и снова использовать Covenrt.Toxxx или Encoding.ASCII.ToString() для записи в байты.

Улучшение решений 2:

Создайте пользовательские атрибуты и украсьте ваши классы так, чтобы у вас была фабрика, которая считывает метаданные и раздувает ваши объекты, используя для вас байтовый массив.Это наиболее полезно, если у вас есть более пары таких классов.

Альтернатива решениям 2:

Вы можете передавать поток вместо байтового массива, который быстрее,Здесь вы должны использовать BinaryReader и BinaryWriter для чтения и записи значений.Строки, однако, немного хитрые, так как, я думаю, они также записывают длину.

0 голосов
/ 09 августа 2011

Эта библиотека может помочь вам http://f2enum.codeplex.com/

0 голосов
/ 09 декабря 2010

Я согласен с OJ, но даже с StringReader вам все равно понадобится позиция каждого отдельного значения, чтобы разобрать его в строке ... нет ничего плохого в подстроке, просто убедитесь, что вы используете статические константы при определении начала и конца длины. Пример:

private static int VAR_START_INDEX = 0;
private static int VAR_END_INDEX = 4;

String data = "thisisthedata";

String var = data.Substring(VAR_START_INDEX,VAR_END_INDEX);
//var would then be equal to 'this'
0 голосов
/ 09 декабря 2010

Используйте StringReader для анализа текста, тогда вам не нужно будет использовать подстроку.Линк тебе здесь не поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...