Чтение записи фиксированной ширины из текстового файла - PullRequest
18 голосов
/ 02 октября 2008

У меня есть текстовый файл, полный записей, где каждое поле в каждой записи имеет фиксированную ширину. Мой первый подход заключается в том, чтобы проанализировать каждую запись, просто используя 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;

Ответы [ 7 ]

26 голосов
/ 02 октября 2008

Использование 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); 
6 голосов
/ 23 сентября 2012

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

5 голосов
/ 02 октября 2008

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

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

2 голосов
/ 02 октября 2008

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

1 голос
/ 02 октября 2008

К сожалению, из коробки CLR предоставляет только Substring для этого.

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

0 голосов
/ 02 октября 2008

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

0 голосов
/ 02 октября 2008

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

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