ReadLine()无法读取整行

时间:2013-12-12 21:09:47

标签: c# text-files readline

今天我发现了为什么会出现这个问题或者在使用C#ReadLine()从文本文件中逐行读取时出现此问题的原因。

问题:

假设文本文件中有3行。每个长度等于400.(手动计数) 从C#ReadLine()读取行并检查长度 Console.WriteLine(str.length); 我发现它打印出来了:

Line 1 => 400
Line 2 => 362
Line 3 => 38
Line 4 => 400

我很困惑,文本文件只有3行,为什么它的打印4也随着长度的变化而变化。然后我快速检查“\ n”或“\ r”或组合“\ r \ n”但我没有找到任何,但我发现的是2双引号ex => “abcd”,在第二行。

然后我改变了我的代码以打印线本身和男孩我很惊讶,我在控制台输出如下:

Line 1 > blahblahblabablabhlabhlabhlbhaabahbbhabhblablahblhablhablahb
Line 2 > blablabbablablababalbalbablabal"blabablhabh
Line 3 > "albhalbahblablab
Line 4 > blahblahblabablabhlabhlabhlbhaabahbbhabhblablahblhablhablahb

现在我尝试使用替换函数删除双引号“”但是我得到相同的4行结果只是没有双引号。

现在请告诉我除手动编辑以外的任何解决方案以克服此情况。 这是我的代码简单代码:

static void Main(string[] args)
{

    FileStream fin;
    string s;
    string fileIn = @"D:\Testing\CursedtextFile\testfile.txt";

    try
    {
        fin = new FileStream(fileIn, FileMode.Open); 
    }
    catch (FileNotFoundException exc)
    {
        Console.WriteLine(exc.Message + "Cannot open file.");
        return;
    }

    StreamReader fstr_in = new StreamReader(fin, Encoding.Default, true);

    int cnt = 0;

    while ((s = fstr_in.ReadLine()) != null)  
    {
        s = s.Replace("\""," ");
        cnt = cnt + 1;
        //Console.WriteLine("Line "+cnt+" => "+s.Length);
        Console.WriteLine("Line " + cnt + " => " + s);
    }

    Console.ReadLine();
    fstr_in.Close();
    fin.Close();
}

注意:我试图阅读并上传37个文本文件,每个500 MB的金融域,我总是面临这个问题,并且必须手动进行更改。 :(

2 个答案:

答案 0 :(得分:0)

如果问题是:

  • 正确的换行符应该是换行符(10)和回车符(13)的组合
  • 单独的换行符和/或回车符被错误地解释为换行符

然后你可以解决此问题,但解决此问题的最佳和可能最正确方法是转到源代码,修复首先写出这个格式错误的文件的程序。

但是,这是一个LINQPad程序,用空格替换单个换行符或回车符:

void Main()
{
    string input = "this\ris\non\ra\nsingle\rline\r\nThis is on the next line";
    string output = ReplaceLoneLineBreaks(input);

    output.Dump();
}

public static string ReplaceLoneLineBreaks(string input)
{
    if (string.IsNullOrEmpty(input))
        return input;

    var result = new StringBuilder();

    int index = 0;
    while (index < input.Length)
    {
        switch (input[index])
        {
            case '\n':
                if (index == input.Length - 1 || input[index+1] != '\r')
                {
                    result.Append(' ');
                    index++;
                }
                else
                {
                    result.Append(input[index]);
                    result.Append(input[index + 1]);
                    index += 2;
                }
                break;

            case '\r':
                if (index == input.Length - 1 || input[index+1] != '\n')
                {
                    result.Append(' ');
                    index++;
                }
                else
                {
                    result.Append(input[index]);
                    result.Append(input[index + 1]);
                    index += 2;
                }
                break;

            default:
                result.Append(input[index]);
                index++;
                break;
        }
    }
    return result.ToString();
}

答案 1 :(得分:0)

如果线条长度相同,则按行长分割线条,而不是观察行尾。

const int EndOfLine = 2; // CR LF  or = 1 if only LF.
const int LineLength = 400;

string text = File.ReadAllText(path);
for (int i = 0; i < text.Length - EndOfLine; i += LineLength + EndOfLine) {
    string line = text.Substring(i, Math.Min(LineLength, text.Length - i - EndOfLine));
    // TODO Process line
}

如果最后一行未被行尾字符终止,请删除两个- EndOfLineMath.Min部分也只是一种安全措施。如果没有行短于400,则可能没有必要。