如何在使用TextFieldParser时跳过格式错误的行

本文关键字:格式 错误 TextFieldParser | 更新日期: 2023-09-27 17:59:21

我正在使用TextFieldParser来解析csv文件。如果它是一个格式良好的csv,则它可以正常工作。然而,在某些情况下,有些行的csv格式不正确:

1112222,"3333',4444,555

我使用的代码是这样的:

using (Microsoft.VisualBasic.FileIO.TextFieldParser MyReader = new
    Microsoft.VisualBasic.FileIO.TextFieldParser(@"C:'myData.csv"))
{
    MyReader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
    MyReader.SetDelimiters(new string[] { "'t", "," });
    MyReader.HasFieldsEnclosedInQuotes = true;
    MyReader.TextFieldType = FieldType.Delimited;
    MyReader.TrimWhiteSpace = true;
    //MyReader.
    while (!MyReader.EndOfData)
    {
        try
        {
            string[] fields = MyReader.ReadFields();
            Debug.WriteLine(fields.Length.ToString());
        }
        catch (Microsoft.VisualBasic.FileIO.MalformedLineException ex)
        {
            MessageBox.Show("Line " + ex.LineNumber.ToString() + 
                "is not valid and will be skipped: " + MyReader.ErrorLine + 
                "'r'n'r'n" + ex.ToString());
        }
    }
}

由于某些原因,它捕获MalformedLineException,但MyReader.EndOfData在那之后是真的,即使后面有一些行。

这是故意的吗?有什么方法可以让它跳过格式错误的行,然后解析后面的行吗?

感谢

如何在使用TextFieldParser时跳过格式错误的行

我没有找到任何方法让程序继续读取文件。但是试试这个代码。

using Microsoft.VisualBasic.FileIO;
...
private void ReadFunction()
{
    using (TextFieldParser MyReader =
        new TextFieldParser(@"C:'temp'myData.csv"))
    {
        int lineRead = 1;
        while (!MyReader.EndOfData)
        {
            try
            {
                string[] fields = ParseHelper(MyReader.ReadLine(), lineRead++);
                Console.WriteLine(fields.Length.ToString());
            }
            catch (MalformedLineException ex)
            {
                Console.WriteLine(ex.Message);          
            }
        }
        Console.ReadKey();
    }
}
private string[] ParseHelper(String line, int lineRead)
{
    MemoryStream mem = new MemoryStream(ASCIIEncoding.Default.GetBytes(line));
    TextFieldParser ReaderTemp = new TextFieldParser(mem);
    ReaderTemp.TextFieldType = FieldType.Delimited;
    ReaderTemp.SetDelimiters(new string[] { "'t", "," });
    ReaderTemp.HasFieldsEnclosedInQuotes = true;
    ReaderTemp.TextFieldType = FieldType.Delimited;
    ReaderTemp.TrimWhiteSpace = true;
    try
    {
        return ReaderTemp.ReadFields();
    }
    catch (MalformedLineException ex)
    {
        throw new MalformedLineException(String.Format(
            "Line {0} is not valid and will be skipped: {1}'r'n'r'n{2}",
            lineRead,ReaderTemp.ErrorLine, ex));
    }
}

相反,使用using (Microsoft.VisualBasic.FileIO.TextFieldParser MyReader = new Microsoft.VisualBasic.FileIO.TextFieldParser(@"C:'temp'myData.csv")),您可以使用FileStrean读取文本文件,并逐行传递给函数ParseHelper;

我希望这对你有帮助。