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

C# 在可变长度字符串中使用TextFieldParser.FixedWidth,c#,textfieldparser,C#,Textfieldparser,我正在开发一个解析器,该解析器旨在以固定宽度格式(8个字符x 10个字符)读入数据。然而,有时情况并非如此,有时在不符合此要求的区域中存在有效数据。假设存在转义字符(如下图中的+)是不安全的,因为这是几种格式之一 我曾尝试使用TextFieldParser.FixedWidth,并为其提供8x10输入,但任何不符合此数量的内容都会发送到错误行 从我的异常捕获块进行解析似乎不是一个好的做法,是吗 因为只有不一致的线路需要额外的工作,所以暴力法是最好的方法吗?我所有的数据总是以8个字符块的形式出现。

我正在开发一个解析器,该解析器旨在以固定宽度格式(8个字符x 10个字符)读入数据。然而,有时情况并非如此,有时在不符合此要求的区域中存在有效数据。假设存在转义字符(如下图中的+)是不安全的,因为这是几种格式之一

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

  • 从我的异常捕获块进行解析似乎不是一个好的做法,是吗

  • 因为只有不一致的线路需要额外的工作,所以暴力法是最好的方法吗?我所有的数据总是以8个字符块的形式出现。行中的最后一个块可能很棘手,因为如果手动输入,它可能会更短。(前提是#1可以执行)

  • 有更好的工具可以使用吗?我觉得我想用一个固定宽度的textfieldparser把一个方形的钉子装进一个圆孔里

  • 注意:分隔解析不是一个选项,请参见第2个图

    编辑澄清:下面的文本是有限元代码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;
        }
    
    公共静态IEnumerable ParseFixed(字符串文件名、int-width、int-colCount)
    {
    var fieldArrayList=新列表();
    使用(var tfp=newtextfieldparser(文件名))
    {
    tfp.TextFieldType=FieldType.FixedWidth;
    var fieldWidths=新整数[colCount];
    for(int i=0;i


    为什么不看看使用lex或yacc?在这样一个小的数据集上,很难从这里判断从何处获取它。如果可以定义一个一致的规则集,暴力强制可能会起作用。LEX/YACC可能有点过头了?我不确定我是否能够在合理的时间内消化并融入c#应用程序,而不必认真研究它。我同意这是一条重要的学习曲线。如果您对每一行的起始标记和行格式有一定的把握,那么也许每个标记(操作代码)都有一个案例说明。谢谢您向我指出,我以后必须详细阅读。我以前从未听说过它们,似乎它们可能非常强大。它们都非常强大,而且每个都有它的优点/用途,但从经验来看,学习确实需要一个承诺!