如何在使用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
在那之后是真的,即使后面有一些行。
这是故意的吗?有什么方法可以让它跳过格式错误的行,然后解析后面的行吗?
感谢
我没有找到任何方法让程序继续读取文件。但是试试这个代码。
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;
我希望这对你有帮助。