我有一个奇怪的问题。我读了一个文本文件,然后用\ n作为分隔符拆分它。我注意到分割线在末尾包含'\ r'。所以我试图删除它,我尝试使用String.Replace这样做,但没有运气。这是我的代码:
string fileOutput = File.ReadAllText(location);
SettingsManager.proxies.Clear();
foreach (string line in fileOutput.Split('\n'))
{
string cleanLine = line;
if (cleanLine.Contains("\r")) cleanLine.Replace("\r", "");
SettingsManager.proxies.Add(cleanLine);
}
编辑:在盯着代码1分钟后,我发现我没有将替换值分配给原始字符串。
cleanLine.Replace("\r",""); //assigns a value to nothing
我应该将cleanLine分配给cleanLine.Replace();
cleanLine = cleanLine.Replace("\r","");
答案 0 :(得分:7)
如果你打电话:
string[] lines = File.ReadAllLines(location);
它会从你的每一行中删除'\ r'和'\ n'。
答案 1 :(得分:3)
我很确定运行fileOutput.Replace("\r","")
比调用分割后获得的每个字符串的替换更好。它也可以解决您的问题。
答案 2 :(得分:2)
我认为你误解了字符串在C#中的工作方式,以及文本文件在Windows上的工作方式。
在Windows上,新行由回车符(\ r)和换行符(\ n)分隔?所以,这是“正常的”。
其次,在C#中,字符串是不可变的。
if (cleanLine.Contains("\r")) cleanLine.Replace("\r", "");
不指定'已清除'值。
您需要使用cleanLine = cleanLine.Replace("\r","");
第三,从C#中的样式角度来看,应将代码块放在另一行上,并用括号括起来。这是有效的语法,但它降低了可读性。
作为最后一件事 - 您只需打开文本文件并调用ReadLine,而不是像现在一样需要更换字符串。
答案 3 :(得分:1)
在Windows中,行指示符实际上是\r\n
,因此您最好的选择可能是使用文件中其他位置找不到的其他字符来初始替换“\ r \ n”(例如也许“|”),然后然后拆分替换后的角色。否则,如果你只是替换“\ r \ n”,你可能最终会替换一个实际上不在一行末尾的“\ _”(尽管这很可疑)。
你是如何在首先阅读文件的? .Net TextReader
类有一个ReadLine()
方法,使用它可以让你完全避免这个特殊问题。
答案 4 :(得分:1)
正如其他人所建议的那样,请改用File.ReadAllLines()
。它将分为\n
和\r\n
。您的样本可以重写为:
SettingsManager.proxies.Clear();
foreach (string line in File.ReadAllLines(location))
SettingsManager.proxies.Add(line);