2015-09-11 4 views
0

Возможно ли разобрать/прочитать файл с фиксированной позицией, когда позиции известны только во время выполнения? Я вижу, что вопрос о SO, что относится к чему-то подобным использованием «Время воспроизведения записей», но это относится чтение файла с разделителями - Dynamically create a Fixed Length text file with FileHelpersПозиции динамического фиксированного поля FileHelpers

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

спасибо.

+0

копать немного глубже, как это Im думать теперь, что это может быть возможно с помощью отражения, чтобы установить свойство атрибута, я просто хотел бы знать, если есть чистое решение ... спасибо HTTP: // stackoverflow.com/questions/18201971/how-do-i-get-the-custom-attribute-value-of-a-field – user3086298

+1

Могу ли я уточнить, что вы намереваетесь сделать здесь. Вы намерены иметь такую ​​же ширину символов, то есть ширину 80 символов, но внутренний размер каждого столбца и количество столбцов могут измениться? Однако, как только данные загружаются в Class1, вы хотите перенести данные в Class2? где макет, возможно, сократил колонку или добавил новую? Можете ли вы предоставить быстрый пример проекта того, что вы хотите (хотя без магии RuntimeHelpers) – netniV

+0

разные файлы могут иметь разные позиции для поля, так что скажем, имя CustomerName может начинаться с 10 конца 20 в одном файле, но в другом файле может начаться 50 end 90 – user3086298

ответ

1

Это то, что я сделал. Надеюсь, это может вам помочь.

  1. Создан таблицы БД и хранятся различные форматы файла макета Фиксированный (например, размер Имя поля, тип данных и длину поля и т.д. ...)
  2. В UI первый пользователь выбирает Фиксированный компоновки файла, а затем выбирает Фиксированный файл для импорта.
  3. Основываясь на выбранном макете, я создаю фиксированную длину. Тип класса во время выполнения с использованием приведенного ниже кода.

private void ImportFiles() { DataTable dt = GetFixedFileSpecsFromDB(layoutName); //Get the specs //Create Dynamic class based on Specs above FixedLengthClassBuilder cb = GetSpecClass(dt); //Create FileHelpers engine instance FileHelperEngine engine = new FileHelperEngine(cb.CreateRecordClass()); //Read file data into Data table DataTable dtImportData = engine.ReadFileAsDT(ImportFilePath); } //Method to create the Fixed lentgh dynamic class public static FixedLengthClassBuilder GetSpecClass(DataTable dt) { string className = "ImportSpecifications"; FixedLengthClassBuilder cb = new FixedLengthClassBuilder(className); //Loop thru each field and prepare the class foreach (DataRow dr in dt.Rows) { int fieldLength = Convert.ToInt32(dr.Field<decimal>("FieldLength")); switch (dr["FieldDataType"].ToString()) { case "String": cb.AddField(dr.Field<string>("FieldName"), fieldLength, typeof(string)); cb.LastField.FieldNullValue = string.Empty; cb.LastField.TrimMode = FileHelpers.TrimMode.Both; break; case "Date": cb.AddField(dr.Field<string>("FieldName"), fieldLength, typeof(DateTime)); cb.LastField.FieldNullValue = string.Empty; break; case "Integer": cb.AddField(dr.Field<string>("FieldName"), fieldLength, typeof(int?)); //cb.LastField.FieldNullValue = 0; break; case "Long Integer": cb.AddField(dr.Field<string>("FieldName"), fieldLength, typeof(long)); cb.LastField.FieldNullValue = 0; break; case "Decimal": cb.AddField(dr.Field<string>("FieldName"), fieldLength, typeof(decimal?)); //cb.LastField.FieldNullValue = 0; break; default: break; } } return cb; }
+0

спасибо, что я думал, я думал о настраиваемых атрибутах, которые работали для меня, но, по крайней мере, это другой подход, чтобы попробовать ... – user3086298

Смежные вопросы