ETL данных двоичного плоского файла фиксированной ширины с C # - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть двоичный файл, это плоский файл фиксированной ширины, который использует двоичный код (шестнадцатеричный код) для хранения всего, что пользователь не набрал. Например, телефонные номера будут храниться в виде символов, но как идентификатор или рассчитывается значение будет в двоичном формате.

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

Моя цель - иметь возможность запрашивать данные с минимально возможным количеством преобразований. Это не однократное преобразование, а временное событие, которое происходит каждые несколько минут, поражая таблицы размером в несколько сотен МБ, поэтому эффективность оценивается.

...