我正在开发一个旨在以固定宽度格式(8 char x 10 col)读取数据的解析器。但是,有时情况并非如此,有时在不符合此条件的区域中存在有效数据。假设存在转义字符(例如下图中的 +)是不安全的,因为它是几种格式之一。
我曾尝试使用 TextFieldParser.FixedWidth,并给它一个 8x10 的输入,但是任何不符合这个数量的东西都会被发送到 ErrorLine。
从我的异常捕获块中解析似乎不是一个好习惯,是吗?
由于只有不一致的行需要额外的工作,所以强力子方法是最好的方法吗?我所有的数据总是以 8 个字符块的形式出现。一行中的最后一个块可能很棘手,因为如果手动输入它可能会更短。(前提是#1可以做)
有没有更好的工具可以使用?我觉得我正试图用一个固定宽度的 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;
}