0

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

我曾尝试使用 TextFieldParser.FixedWidth,并给它一个 8x10 的输入,但是任何不符合这个数量的东西都会被发送到 ErrorLine。

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

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

  3. 有没有更好的工具可以使用?我觉得我正试图用一个固定宽度的 textfieldparser 在一个圆孔中安装一个方形钉。

注意:分隔解析不是一个选项,请参见第二张图。

编辑澄清:下面的文字是 NASTRAN 的输入卡组的一对摘录,有限元代码。我的目标是有一个通用的解析方法,它将读取文本文件,然后将拆分的字符串 [] 传递给其他方法,以将每张卡片实际处理为特定的映射对象。(例如在下图中,两种对象类型是 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;
    }

示例数据,(打开显示所有字符以获得更好的可见性)

更多示例数据

4

0 回答 0