У меня есть двоичный файл, это плоский файл фиксированной ширины, который использует двоичный код (шестнадцатеричный код) для хранения всего, что пользователь не набрал. Например, телефонные номера будут храниться в виде символов, но как идентификатор или рассчитывается значение будет в двоичном формате.
Я работал над правильным определением всех полей с помощью пользовательского графического интерфейса пользователя (https://youtu.be/OMeghA82kSk),) и в целом доволен тем, где я сейчас нахожусь, но сейчас пришло время начать загрузку данных, и я не тот, кто "прав" «Способ продвижения вперед будет.
Я видел много пакетов, которые я могу использовать, если мои данные были CSV, или если они не использовали смешанные двоичные данные, но не уверен, что делать дальше сейчас, когда я знаю основную информацию для столбцов и типов данных в столбце, или, если мне нужно принять вывод полностью в CSV.
Мое приложение для идентификации макета выдает следующий формат данных, который я могу использовать для составления таблицы:
{
"Date1": {
"Starting Position": 5,
"Column Width": 7,
"Contains Control Chars": 1
},
"RandomID": {
"Starting Position": 13,
"Column Width": 1,
"Contains Control Chars": 0
},
"CustomerID": {
"Starting Position": 15,
"Column Width": 2,
"Contains Control Chars": 1
},
"FirstName": {
"Starting Position": 19,
"Column Width": 15,
"Contains Control Chars": 0
},
"LastName": {
"Starting Position": 35,
"Column Width": 15,
"Contains Control Chars": 0
},
"NickName": {
"Starting Position": 51,
"Column Width": 15,
"Contains Control Chars": 0
},
"DontKnowOrCare": {
"Starting Position": 67,
"Column Width": 4,
"Contains Control Chars": 0
},
"Date2": {
"Starting Position": 72,
"Column Width": 7,
"Contains Control Chars": 0
},
"DontKnowOrCare2": {
"Starting Position": 80,
"Column Width": 4,
"Contains Control Chars": 0
}
}
Хорошо, поэтому эти данные приводят вас только к позиции 84 на линии шириной 1500 байт, что является идеальным примером для моих целей. Я попробовал FileHelpers и получил ошибку западного кодирования, как будто он не хотел читать ничего, кроме базового текста ASCII. Я хотел бы иметь возможность просто указать начало поля, ширину и, если в конце строки мне не нужно 1000 байтов, чтобы не нужно было определять сотню полей, которые мне не нужны примерно так, чтобы синтаксический анализатор не падал.
class FlatFileParse
{
public static void Parse()
{
var engine = new FixedFileEngine<Customer>();
Customer[] result = engine.ReadFile("wrapped.dat");
foreach (var detail in result)
Console.WriteLine(" Client: {0}, Name: {1}", detail.DateScheduled, detail.PatientName);
}
}
[FixedLengthRecord()]
public class Customer
{
[FieldFixedLength(5)]
public int InitialNull;
[FieldFixedLength(7)]
public string Date1;
[FieldFixedLength(1)]
public int OfficeId;
[FieldFixedLength(3)]
public int CustomerId;
[FieldFixedLength(15)]
public int CustomerName;
}
Я также изучал ETLyte и других, но не мог понять, как выполнить преобразование Little Endian в поле, такое как CustomerID, или в сложной манипуляции байтами в поле даты.
Моя цель - иметь возможность запрашивать данные с минимально возможным количеством преобразований. Это не однократное преобразование, а временное событие, которое происходит каждые несколько минут, поражая таблицы размером в несколько сотен МБ, поэтому эффективность оценивается.