Подтвердить что ты не робот

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

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

Ответ 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); 

Ответ 4

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

Ответ 5

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

Ответ 7

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