C# 正在从文件读取的行中删除\r\n
我有一个奇怪的问题。我读取一个文本文件,然后使用\n作为分隔符拆分它。我注意到拆分行的末尾包含“\r”。所以我试着移除它,我试着用String.Replace来移除它,但运气不好。这是我的密码:C# 正在从文件读取的行中删除\r\n,c#,regex,C#,Regex,我有一个奇怪的问题。我读取一个文本文件,然后使用\n作为分隔符拆分它。我注意到拆分行的末尾包含“\r”。所以我试着移除它,我试着用String.Replace来移除它,但运气不好。这是我的密码: string fileOutput = File.ReadAllText(location); SettingsManager.proxies.Clear(); foreach (string line in fileOutput.Split('\n')) {
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()
我敢肯定,运行
fileOutput.Replace(“\r”,”)
比为拆分后获得的每个字符串调用Replace要好。这可能也会解决您的问题。在Windows中,行指示符实际上是\r\n
,因此您最好先用文件中其他地方找不到的字符(例如“|”)替换“\r\n”,然后在替换的字符上拆分。否则,如果只替换“\r”,则可能会替换一个实际上不在行尾的“\r”(尽管这很可疑)
你一开始是怎么读文件的?.Net
TextReader
类有一个ReadLine()
方法,使用该方法可以完全避免这个特殊问题。我认为您误解了字符串在C#中的工作方式,以及文本文件在Windows上的工作方式
在Windows上,新行由回车符(\r)和换行符(\n)分隔?所以,这是“正常的”
其次,在C#中,字符串是不可变的
if(cleanLine.Contains(“\r”))cleanLine.Replace(“\r”,”)代码>
不指定“已清理”值
您需要使用cleanLine=cleanLine.Replace(“\r”,”)代码>
第三,从C#中的样式角度来看,您应该将代码块放在另一行上,并用括号将它们括起来。不这样做是有效的语法,但会降低可读性
最后,您只需打开文本文件并调用ReadLine,而无需像现在这样进行字符串替换。如果调用:
string[] lines = File.ReadAllLines(location);
它将为您删除每一行中的“\r”和“\n”。如其他人所建议的,请改用File.ReadAllLines()
。它将在\n
和\r\n
上拆分。您的样本可以改写为:
SettingsManager.proxies.Clear();
foreach (string line in File.ReadAllLines(location))
SettingsManager.proxies.Add(line);
事实上我不知道我是怎么做到的。我需要休息一下。谢谢Vlad,它解决了问题=]谢谢。休息一下总比花几个小时追逐你一开始就不会制造的虫子要好;)另外,如果您将我的答案标记为解决问题的答案,我会很高兴。arghh,刚才也这么说:)+1这看起来是最好的方法。那么为什么要添加重复的答案呢?这不是重复的答案,它解释了为什么使用ReadAllLines()更可取,并且它包括一个简洁的代码示例。另一个答案也解释了这一点。示例代码是冗余的SettingsManager.proxies=新列表(File.ReadAllLines(location))
会更好。或者AddRange
如果属性是只读的。是的,我当然知道我应该使用cleanLine=cleanLine.Replace();我也知道这是我的主要问题,导致我的代码无法工作。我错过了,因为我已经很久没睡了。谢谢你的建设性评论Will=]+1我想没有必要这么复杂。我遗漏了一些非常简单的东西,我没有将替换的字符串分配给原始字符串,这就是它不起作用的原因。不过,感谢您的评论=]
SettingsManager.proxies.Clear();
foreach (string line in File.ReadAllLines(location))
SettingsManager.proxies.Add(line);