程序开发 > C# > 正文

Splite以换行符\n分隔字符串注意问题

亮术网 2020-08-06 本网原创

平常大多用 Splite 拆分一些不是特别长的字符串,并且拆分符很少用到换行符\n,也不会出现什么意外问题。然而在用Splite以换行符\n拆分网站日志的时候,却出现了意想不到的问题,不知为什么,除最后一行外,其它行的末尾都被加上了一个空格

 

假如要分析的网站日志如下:

2013-04-16 00:02:35 W3SVC7344 142.4.113.28 GET /abate/Abate.aspx type=afja&tn=%25e4%25ba%25a4%25e9%2580%259a%25e5%25ae%2589%25e5%2585%25a8%25e8%25ae%25be%25ef%25bf%25bd%2525b&an=542625&fg=1 80 - 66.249.74.137 Mozilla/5.0+(compatible;+Googlebot/2.1;++http://www.google.com/bot.html) 200 0 0
2013-04-16 00:02:50 W3SVC7344 142.4.113.28 GET / - 80 - 222.77.187.33 Mozilla/5.0+(compatible;+MSIE+8.0;+Windows+NT+6.1;+Trident/5.0) 200 0 0
2013-04-16 00:02:52 W3SVC7344 142.4.113.28 GET /Abate/Abate.aspx type=fzxf&tn=%e6%a0%a1%e6%9c%8d&an=210112&fg=1 80 - 218.30.103.148 Sogou+web+spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07) 200 0 0
2013-04-16 00:05:58 W3SVC7344 142.4.113.28 GET /House/Item.aspx type=3&tf=&stf=&tn=&stn=&an=630105&fg=1 80 - 220.181.108.165Mozilla/5.0+(compatible;+Baiduspider/2.0;++http://www.baidu.com/search/spider.html) 200 0 0
2013-04-16 00:06:12 W3SVC7344 142.4.113.28 GET /at/201110/844885345.htm - 80 - 182.118.25.174 Mozilla/5.0+(Windows;+U;+Windows+NT+5.1;+zh-CN;+rv:1.8.0.11)++Firefox/1.5.0.11;+360Spider 200 0 0
2013-04-16 04:30:07 W3SVC7344 142.4.113.28 GET /Abate/Abate.aspx an=430122&sf=4 80 - 61.135.249.221 Mozilla/5.0+(compatible;+YoudaoBot/1.0;+http://www.youdao.com/help/webmaster/spider/;+) 200 0 0
2013-04-16 04:30:13 W3SVC7344 142.4.113.28 GET /at/201207/535370620.htm - 80 - 123.151.148.178 Sosospider+(+http://help.soso.com/webspider.htm) 200 0 0

 

分析代码如下:

private void ParseLogs()
  {
    StreamReader sr = new StreamReader(Server.MapPath("/db/an.log"));

  string lines = sr.ReadToEnd();//把日志全部读入内存
    string[] al = lines.Split('\n');//以换行符\n拆分日志

  for (int i = 0; i < al.Length; i++)
      Response.Write("每行最一个字符=" + al[i].Substring(al[i].Length - 1) + ";倒数第二个字符=" + al[i].Substring(al[i].Length - 2, 1) + "<br />");

  sr.Close();
  }

 

输出结果:

每行最一个字符= ;倒数第二个字符=0

每行最一个字符= ;倒数第二个字符=0

每行最一个字符= ;倒数第二个字符=0

每行最一个字符= ;倒数第二个字符=0

每行最一个字符= ;倒数第二个字符=0

每行最一个字符= ;倒数第二个字符=0

每行最一个字符=0;倒数第二个字符=

上面的网站日志都是以0结尾的,而输出结果中,只有最后一条的“最后一个字符”是0,而其它行最后一个字符都变成了空格,这显然是用换行符\n拆分时,额外加上的

如果编程时,涉及到最后一个字符串的处理,尤其是把最后一个字符串作为某某条件,一定不可忽视这种情况,否则程序无法输出正确的结果。