Чтение записи фиксированной ширины из текстового файла
У меня есть текстовый файл, полный записей, где каждое поле в каждой записи является фиксированной шириной. Моим первым подходом было бы проанализировать каждую запись, просто используя string.Substring(). Есть ли способ лучше?
Например, формат можно охарактеризовать как:
<Field1(8)><Field2(16)><Field3(12)>
И пример файла с двумя записями может выглядеть так:
SomeData0000000000123456SomeMoreData
Data2 0000000000555555MoreData
Я просто хочу убедиться, что я не упускаю из виду более элегантный способ, чем Substring().
Обновление: Я в конечном итоге пошел с регулярным выражением, например Killersponge:
private readonly Regex reLot = new Regex(REGEX_LOT, RegexOptions.Compiled);
const string REGEX_LOT = "^(?<Field1>.{6})" +
"(?<Field2>.{16})" +
"(?<Field3>.{12})";
Затем я использую следующее для доступа к полям:
Match match = reLot.Match(record);
string field1 = match.Groups["Field1"].Value;
Ответы
Ответ 1
Подстрока звучит хорошо для меня. Единственным недостатком, о котором я могу сразу подумать, является то, что он означает копирование данных каждый раз, но я бы не стал беспокоиться об этом, пока вы не докажете это узким местом. Подстрока проста:)
Вы можете использовать регулярное выражение для соответствия целой записи за раз и захватить поля, но я думаю, что это было бы излишним.
Ответ 2
Используйте 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<MyData>();
// To Read Use:
var res = engine.ReadFile("FileIn.txt");
// To Write Use:
engine.WriteFile("FileOut.txt", res);
Ответ 3
Зачем изобретать колесо? Используйте .NET TextFieldParser класс для этого инструкции для Visual Basic.
Ответ 4
Возможно, вам придется следить, если конец строк не заполняется пробелами, чтобы заполнить поле, ваша подстрока не будет работать без каких-либо проблем, чтобы определить, сколько еще строк читать. Это, конечно, относится только к последнему полю:)
Ответ 5
Нет, подстрока в порядке. Это для чего.
Ответ 6
К сожалению, из коробки CLR предоставляет только подстроку для этого.
Кто-то из CodeProject сделал собственный парсер, используя атрибуты для определения полей, вы можете посмотреть на это.
Ответ 7
Вы можете настроить источник данных ODBC для файла фиксированного формата, а затем получить доступ к нему как к любой другой таблице базы данных.
Это дает дополнительное преимущество в том, что определенные знания формата файла не скомпилированы в ваш код за тот роковой день, когда кто-то решает вставить дополнительное поле посередине.