代码之家  ›  专栏  ›  技术社区  ›  LONG

用{lf}替换{crlf}

c#
  •  0
  • LONG  · 技术社区  · 6 年前

    我有一个别人发来的文本文件。如果我在notepad++中打开并查看所有符号,我可以看到{lf}和{crlf}都用作行分隔符。

    例子:

    第1行: ABC{CRLF}

    第2行: xyz{lf}

    问题: 如果我想替换 {CRLF} 具有 {LF} 并写入一个新文件,为什么输出文本文件不能显示单独的行和分隔符符号消失。 Write 只需写一行并附加另一行,而不必开始新的一行,但该行仍有 {lf} 在里面,不是吗?是因为我在windows系统工作吗?但是原始的文件 {lf} {CR}{LF} 可以看作是两条独立的线吗?

    代码非常简单:

    using (StreamReader sr = new StreamReader(@"\\...\TEST.txt"))
    {
        using (StreamWriter sw = new StreamWriter(@"\\...\TEST2.txt"))
        {
            string line = "";
    
            while ((line = sr.ReadLine()) != null)
            {
                sw.Write(line.Replace("\r\n", "\n"));
            }
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  4
  •   Magnetron    6 年前

    当你使用 ReadLine() 你在修改下线字符(CR和LF)。相反,您应该采用以下方法之一:

    string file1 = @"\\...\TEST.txt";
    string file2 = @"\\...\TEST2.txt";
    
    using (StreamReader sr = new StreamReader(file1))
    {
        using (StreamWriter sw = new StreamWriter(file2))
        {
            string text = sr.ReadToEnd();        
            sw.Write(text.Replace("\r\n", "\n"));        
        }
    }
    

    或者

    File.WriteAllText(file2,File.ReadAllText(file1).Replace("\r\n", "\n"));
    

    但前提是你的文件不太大。否则,吉姆的解决办法就是这样。

        2
  •  3
  •   Jim Mischel    6 年前

    你的代码不起作用,因为当你打电话 sr.Readline() ,返回的字符串不包含CRLF字符。这些字符是由 WriteLine ,基本上是 Write(s + Environment.NewLine) 是的。

    要使代码工作,请将其更改为

    while ((line = sr.ReadLine()) != null)
    {
        sw.Write(line + "\n");
    }
    

    您可以通过以下方法简化代码:

    File.WriteAllLines("outputFileName",
       FileReadLines("inputFileName").Select(s => s + "\n");