ETL данных двоичного плоского файла фиксированной ширины с C#
У меня есть двоичный файл, это плоский файл фиксированной ширины, который использует двоичный (шестнадцатеричный) для хранения всего, что пользователь не набрал. Например, телефонные номера будут храниться в виде символа, но идентификатор или вычисленное значение будет в двоичном
Я работал над правильным определением всех полей с помощью пользовательского графического интерфейса ( 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, или сложную манипуляцию байтами в поле даты.
Моя цель - иметь возможность запрашивать данные с минимально возможным количеством преобразований. Это не однократное преобразование, а временное событие, которое происходит каждые несколько минут, ударяя по таблицам размером в несколько сотен МБ, поэтому эффективность оценивается.