我使用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
之后才会成功,即使后面有一些行。
这是设计的吗?有什么方法可以让它跳过格式错误的行,并解析后面的行?
由于
答案 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;
我希望这对你有所帮助。