以固定的宽度和不同的大小分割文本文件

时间:2018-10-15 22:53:43

标签: c# .net fixed-width

我陷入了一个需要以固定宽度分割文件的问题。每个字段都可以通过其第一个字符来标识。

文件包含多种格式,例如,第一行的格式为{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;
}

这些是我因行少而导致的错误: 无法使用当前的FieldWidths解析第3行。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

尝试一下。它应该可以工作

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

        }
    }
}