Чтение записи фиксированной ширины из текстового файла
У меня есть текстовый файл, полный записей, где каждое поле в каждой записи является фиксированной шириной. Моим первым подходом было бы проанализировать каждую запись, просто используя string.Substring (). Есть ли способ лучше?
Например, формат может быть описан как:
И пример файла с двумя записями может выглядеть так:
- Отправка и анализ объектов JSON в Android
- Как разобрать JSON в Android?
- Как я могу разбирать строку в BigDecimal?
- Разделимый разделитель CSV в .NET.
- Используемый парсер Улица Адрес, Город, Штат, Почтовый индекс из строки
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;
- Удалить расширение файла из строки имени файла
- Использование GSON в Android для анализа сложного объекта JSON
- Как создать новый язык для использования в Visual Studio
- Как сделать Integer.parseInt () для десятичного числа?
- Как анализировать математическое выражение, заданное как строку, и возвращать число?
- Прочитайте и проанализируйте Json-файл в C #
- Используйте комбинатор парсера Scala для parsingа CSV-файлов
- Разбор JSON для Java - приложение для Android
Подстрока звучит хорошо для меня. Единственный недостаток, о котором я могу сразу подумать, состоит в том, что он означает копирование данных каждый раз, но я бы не стал беспокоиться об этом, пока не докажу, что это узкое место. Подстрока проста 🙂
Вы можете использовать регулярное выражение для соответствия целой записи за раз и захватить поля, но я думаю, что это было бы излишним.
Используйте 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 для файла фиксированного формата, а затем получить доступ к нему как к любой другой таблице базы данных. Это имеет дополнительное преимущество в том, что конкретные знания формата файла не скомпилированы в ваш код за тот судьбоносный день, когда кто-то решает вставить дополнительное поле в середине.