在可变长度字符串中使用TextFieldParser.FixedWidth

时间:2015-06-19 02:29:43

标签: c# textfieldparser

我正在研究一种解析器,它旨在读取固定宽度格式的数据(8 char x 10 col)。但是,有时情况并非如此,并且有时在不符合此要求的区域中存在有效数据。假设存在转义字符(例如下图中的+)是不安全的,因为这是几种格式之一。

我曾尝试使用TextFieldParser.FixedWidth,并为其提供8x10输入,但任何不符合此数量的内容都会被发送到ErrorLine。

  1. 从我的异常捕获块中解析似乎不是一个好习惯,是吗?

  2. 由于只有差异性的线路需要额外的工作,蛮力的方法是最好的方法吗?我的所有数据总是有8个字符块。一行中的最后一个块可能很棘手,因为如果手动输入它可能会更短。 (预测#1可以做)

  3. 是否有更好的工具可供使用?我觉得我试图在一个带有固定宽度文本区域分析器的圆孔中安装一个方形钉。

  4. 注意:定界解析不是一个选项,请参见第二个数字。

    编辑以供澄清:下面的文字是NASTRAN的输入套牌的一段摘录,有限元素代码。我的目标是有一个通用的解析方法,它将读取文本文件,然后将拆分的字符串[] s移交给其他方法,以实际处理每个卡到特定的映射对象。 (例如,在下图中,两个对象类型是RBE3和SET1)

    提取方法:

        public static IEnumerable<string[]> ParseFixed(string fileName, int width, int colCount)
        {
            var fieldArrayList = new List<string[]>();
            using (var tfp = new TextFieldParser(fileName))
            {
                tfp.TextFieldType = FieldType.FixedWidth;
                var fieldWidths = new int[colCount];
                for (int i = 0; i < fieldWidths.Length; i++)
                {
                    fieldWidths[i] = width;
                }
                tfp.CommentTokens = new string[] { "$" };
                tfp.FieldWidths = fieldWidths;
                tfp.TrimWhiteSpace = true;
                while (!tfp.EndOfData)
                {
                    try
                    {
                        fieldArrayList.Add(tfp.ReadFields());
                    }
                    catch (Microsoft.VisualBasic.FileIO.MalformedLineException ex)
                    {
                        Debug.WriteLine(ex.ToString());
                        // parse atypical lines here...?
                        continue;
                    }
                }
            }
            return fieldArrayList;
        }
    

    example data, (Show All Characters turned on for better visibility)

    more example data

0 个答案:

没有答案