Чтение записи фиксированной ширины из текстового файла

У меня есть текстовый файл, полный записей, где каждое поле в каждой записи является фиксированной шириной. Моим первым подходом было бы проанализировать каждую запись, просто используя string.Substring (). Есть ли способ лучше?

Например, формат может быть описан как:

 

И пример файла с двумя записями может выглядеть так:

 SomeData0000000000123456SomeMoreData Data2 0000000000555555MoreData 

Я просто хочу удостовериться, что не упускаю из виду более элегантный способ, чем Substring ().


Обновление: я в конечном итоге пошел с регулярным выражением, например Killersponge:

 private readonly Regex reLot = new Regex(REGEX_LOT, RegexOptions.Compiled); const string REGEX_LOT = "^(?.{6})" + "(?.{16})" + "(?.{12})"; 

Затем я использую следующее для доступа к полям:

 Match match = reLot.Match(record); string field1 = match.Groups["Field1"].Value; 

Подстрока звучит хорошо для меня. Единственный недостаток, о котором я могу сразу подумать, состоит в том, что он означает копирование данных каждый раз, но я бы не стал беспокоиться об этом, пока не докажу, что это узкое место. Подстрока проста 🙂

Вы можете использовать регулярное выражение для соответствия целой записи за раз и захватить поля, но я думаю, что это было бы излишним.

Используйте FileHelpers .

Пример:

 [FixedLengthRecord()] public class MyData { [FieldFixedLength(8)] public string someData; [FieldFixedLength(16)] public int SomeNumber; [FieldFixedLength(12)] [FieldTrim(TrimMode.Right)] public string someMoreData; } 

Тогда это так просто:

 var engine = new FileHelperEngine(); // To Read Use: var res = engine.ReadFile("FileIn.txt"); // To Write Use: engine.WriteFile("FileOut.txt", res); 

Зачем изобретать колесо? Используйте class TextFieldParser .NET для этого руководства для Visual Basic .

Возможно, вам придется следить, если конец строк не заполняется пробелами, чтобы заполнить поле, ваша подстрока не будет работать без каких-либо проблем, чтобы определить, сколько еще строки для чтения. Это, конечно, относится только к последнему полю 🙂

Нет, подстрока в порядке. Вот для чего это.

К сожалению, из командной строки CLR предоставляет только подстроку.

Кто-то из CodeProject сделал собственный парсер, используя атрибуты для определения полей , вы можете посмотреть на это.

Вы можете настроить источник данных ODBC для файла фиксированного формата, а затем получить доступ к нему как к любой другой таблице базы данных. Это имеет дополнительное преимущество в том, что конкретные знания формата файла не скомпилированы в ваш код за тот судьбоносный день, когда кто-то решает вставить дополнительное поле в середине.

  • JSON Parsing в Android
  • Ресурсы обучения для парсеров, переводчиков и компиляторов
  • Почему C ++ не может быть проанализирован парсером LR (1)?
  • Есть ли Java XML API, который может анализировать документ без разрешения объектов символов?
  • Как определить, является ли строка числом?
  • Лучший способ разобрать поплавок?
  • Логическое выражение (грамматика) в c ++
  • Как получить ответ как String с использованием модификации без использования GSON или любой другой библиотеки в android
  • JSONException: значение типа java.lang.String не может быть преобразовано в JSONObject
  • чтение файла по строкам в go
  • Дата синтаксиса в Bash
  • Давайте будем гением компьютера.