Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在从文件读取的行中删除\r\n_C#_Regex - Fatal编程技术网

C# 正在从文件读取的行中删除\r\n

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')) {

我有一个奇怪的问题。我读取一个文本文件,然后使用\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()


我敢肯定,运行
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);