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

时间:2014-04-22 21:26:59

标签: c# .net

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

  

111,2222," 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之后才会成功,即使后面有一些行。

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

由于

1 个答案:

答案 0 :(得分:2)

我没有找到程序继续读取文件的方法。 但试试这段代码。

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;

我希望这对你有所帮助。