Разделить текстовый файл фиксированной ширины с разными размерами

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

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

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


person Madasir Ahmed    schedule 15.10.2018    source источник
comment
Есть ли библиотека, которую вы можете использовать??? в джаве много   -  person Bruce Martin    schedule 16.10.2018
comment
Я использую С# .net.   -  person Madasir Ahmed    schedule 16.10.2018
comment
нельзя разделить строку пробелом?   -  person Chetan Ranpariya    schedule 16.10.2018
comment
вы можете установить последний как -1, указывающий переменную ширину (например, format = new int[] { 1, 11, -1};. Если есть шанс, что у вас будет пустая строка, вы можете также добавить условие после myReader.ReadLine(), чтобы проверить это перед вызовом currentLine[0] или вы получите ошибку.   -  person C. Mitchell    schedule 16.10.2018


Ответы (1)


Попробуй это. Он должен работать

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();
            }

        }
    }
}
person ManishM    schedule 16.10.2018