C# 在可变长度字符串中使用TextFieldParser.FixedWidth
我正在开发一个解析器,该解析器旨在以固定宽度格式(8个字符x 10个字符)读入数据。然而,有时情况并非如此,有时在不符合此要求的区域中存在有效数据。假设存在转义字符(如下图中的+)是不安全的,因为这是几种格式之一 我曾尝试使用TextFieldParser.FixedWidth,并为其提供8x10输入,但任何不符合此数量的内容都会发送到错误行C# 在可变长度字符串中使用TextFieldParser.FixedWidth,c#,textfieldparser,C#,Textfieldparser,我正在开发一个解析器,该解析器旨在以固定宽度格式(8个字符x 10个字符)读入数据。然而,有时情况并非如此,有时在不符合此要求的区域中存在有效数据。假设存在转义字符(如下图中的+)是不安全的,因为这是几种格式之一 我曾尝试使用TextFieldParser.FixedWidth,并为其提供8x10输入,但任何不符合此数量的内容都会发送到错误行 从我的异常捕获块进行解析似乎不是一个好的做法,是吗 因为只有不一致的线路需要额外的工作,所以暴力法是最好的方法吗?我所有的数据总是以8个字符块的形式出现。
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#应用程序,而不必认真研究它。我同意这是一条重要的学习曲线。如果您对每一行的起始标记和行格式有一定的把握,那么也许每个标记(操作代码)都有一个案例说明。谢谢您向我指出,我以后必须详细阅读。我以前从未听说过它们,似乎它们可能非常强大。它们都非常强大,而且每个都有它的优点/用途,但从经验来看,学习确实需要一个承诺!