Разделить текстовый файл с фиксированной шириной с различными размерами - PullRequest
0 голосов
/ 16 октября 2018

Я застрял в проблеме, где мне нужно разделить файл с фиксированной шириной.Каждое поле может быть идентифицировано по его первому символу.

Файл содержит несколько форматов, например, формат первой строки: {1, 11, 12}, а формат второй строки: {1, 10, 12}.Оба идентифицируются с первым персонажем.

AFirstField SecondFields
BBField    SecondFields

Однако иногда строка может содержать меньше символов, как показано ниже.

AFirstField S

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

string[] data;

    using (TextFieldParser myReader = new TextFieldParser(filePath))
    {
        myReader.TextFieldType = FieldType.FixedWidth;

        while (!myReader.EndOfData)
        {
            currentLine = myReader.ReadLine();
            recordType = currentLine[0].ToString();

            if (!recordType.Equals("H"))
            {
                myReader.FieldWidths = returnLineFormat();
                myReader.HasFieldsEnclosedInQuotes = true;
               data = myReader.ReadFields();



                //if (recordType.Equals("R"))
                //{
                //    ISD.Add(data);
                //}

            }

        }

    }


private int[] returnLineFormat()
{
    int[] format = null;

    if ((recordType == "A"))
    {
        format = new int[] { 1, 11, 12};
    }
    else if ((recordType == "B"))
    {
        format = new int[] { 1, 10, 12};
    }

    return format;
}

Это ошибки, которые я получаю из-за того, что в строке меньше материала: Строка 3невозможно проанализировать с использованием текущих значений FieldWidths.

Есть ли способ обойти эту проблему?

1 Ответ

0 голосов
/ 16 октября 2018

Попробуй это.Должно работать

static int[] returnLineFormat(string recordType)
{
    int[] format = null;

    if ((recordType == "A"))
    {
        format = new int[] { 1, 11, 12 };
    }
    else if ((recordType == "B"))
    {
        format = new int[] { 1, 10, 12 };
    }

    return format;
}

static void Main(string[] args)
{
    string[] data;

    using (TextFieldParser myReader = new TextFieldParser(@"TextParserExample.txt"))
    {
        myReader.TextFieldType = FieldType.FixedWidth;

        while (!myReader.EndOfData)
        {
            var recordType = myReader.PeekChars(1);

            if (!recordType.Equals("H"))
            {
                var lineLength = myReader.PeekChars(1000).Length;
                var currentLine = myReader.ReadLine();
                var lengths = returnLineFormat(recordType);
                lengths[2] = lineLength - (lengths[0] + lengths[1]);

                myReader.FieldWidths = lengths;
                myReader.HasFieldsEnclosedInQuotes = true;
                data = myReader.ReadFields();
            }

        }
    }
}
...