C#File.ReadAllLines和StreamReader.ReadLine拆分一些行

时间:2014-11-22 04:57:27

标签: c# csv file-io

我有一个项目在工作中根据一组任意规则读取和转换CSV文件,选择一个文件告诉程序它应该如何根据输入输出数据并解析文件。

我遇到的问题是,当我从输入文件中读取行时,它有时会读取额外的行或分割行到两行,我最初使用ReadAllLines然后使用此代码进行测试:

int testCount = 0;
StreamReader sr = File.OpenText(_FilePath.Text);
while(!sr.EndOfStream)
{
    sr.ReadLine();
    testCount++;
}
sr.Close();
sr.Dispose();

Console.WriteLine("Lines in For: " + testCount);

发现有627行的文件被读取为681行(使用ReadAllLines并计算上述代码中的行。

我尝试寻找有相同问题的人,并尝试查看这些方法中是否有最大长度的“行”,谷歌上没有任何内容,文件中的第一行就是这个一个(改变信息保护隐私,所有特殊字符都存在)

CODE, A/B Company Name, CONTACT NAME, ATTN  NAME A/B, 1234 CORPORATE CORP ST, Smithington, SM, 1234, , 123-456-7890, 123-456-7890, 12345 Plum ROAD, , Nowhere, NW, 12345, A/B Company Name2, Courier, , "Some A Info B For.Shipping Accnt. # 123456789 calendar days early^ 3 days late.", , 

文件本身已从excel电子表格导出为CSV,原始文件中的所有逗号都替换为^(以防止出现问题),稍后将重新转换为逗号。

那么,任何人都知道ReadAllLines中一条线的长度有限制,或者幕后还有其他什么东西在进行?因为这是从Excel导出的(最初是一个DBF文件)我不认为这是文件的问题,但我可能是错的,我能做些什么来找出?

2 个答案:

答案 0 :(得分:3)

我保证File.ReadAllLines()StreamReader.ReadLine()的行为完全符合记录,没有隐藏的陷阱让您偶然发现。

请注意,两者都不区分不同的换行模式。在单个文件中,他们很乐意在\r\n\r\n上划一条线。请注意,这意味着名义上使用\r\n的Windows标准但在其中包含额外\r和/或\n字符的文件将被解释为具有额外的换行符。另请注意,虽然\r\n被视为单个换行符,但\n\r被视为两个换行符。

准确诊断正在发生的事情的方法是将文件视为二进制文件。首先,检查你的输出,看看它在哪里断线,特别是你找到的第一个地方,它打破了你认为它不应该有的线。

然后,在Visual Studio中打开文件,但不要只是打开它,选择“打开方式...”选项(单击“打开”按钮上的黑色三角形),然后选择“二进制编辑器”。查看文件以查找发生第一个不需要的换行符的文本,并检查该位置文件中的十六进制值。你会发现\r\n\r\n的某种组合(\r是十六进制值0D\n是{{1} }})。

答案 1 :(得分:2)

请在阅读文件时指定文件的编码。 File.OpenText默认使用UTF8编码。试试这个:

string[] lines = File.ReadAllLines(path, encoding); //UTF-16 or ASCII etc

http://msdn.microsoft.com/en-us/library/bsy4fhsa(v=vs.110).aspx