我有一个别人发送的文本文件。如果在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"));
}
}
}
答案 0 :(得分:3)
使用ReadLine()
时,将修剪EOL字符(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"));
但是仅当您的文件不是太大时。否则,吉姆解决方案是必经之路。
答案 1 :(得分:3)
您的代码不起作用,因为当您调用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");