【问题标题】:C# File.ReadAllLines and StreamReader.ReadLine Splitting some linesC# File.ReadAllLines 和 StreamReader.ReadLine 拆分一些行
【发布时间】:2014-11-22 04:57:27
【问题描述】:

我有一个项目正在进行中,可以根据一组任意规则读取和转换 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 文件)我不“认为”这是文件的问题,但我可能是错的,我能做些什么来找出答案?

【问题讨论】:

  • 您观察到的这些文件很可能使用不同于 UTF8 的编码。看看这个:stackoverflow.com/questions/10903120/…
  • PS:您可以在 Notepad++ 中查看编码,和/或选择在此处以不同的编码查看该文件,它应该会显示此行号更改。
  • @Alexandru:UTF8 使用与 ASCII、Windows-1252、ISO-8859 等相同的换行符。唯一完全不同的常见编码是 UTF16,如果文件正在错误地读取为 UTF16,或者当它应该是 UTF16 时读取为其他东西,它的错误不仅仅是额外的换行符。
  • 如果您想真的查看文件中的内容,请使用 XVI32 十六进制编辑器:chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm
  • @PeterDuniho 啊,有趣。

标签: c# csv file-io


【解决方案1】:

我保证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\n0A)。

【讨论】:

  • 破坏它的部分,在原始程序中显然有一个支持多行的文本框,在列中添加换行符,但记事本和 excel 不显示这些换行符,但是 C# 读取它们.很高兴知道以供将来参考,但是,拜托,这是一个愚蠢的问题。
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多