c#StreamReader读取指定行的指定字符串

http://blog.csdn.net/Reyes11235813/article/details/5493331

问题:

在一个文件的自定行(LineNum)之后查找一个指定的字符串(queryString).

一下是我想到的两种办法和朋友的一种办法,希望看到这篇文章的大侠们也能提提建议。

现在的三中办法中算是第二种方法跑起来最高效了。一下是他们分别循环10,100,1000次的平均运行时间。

Processing 100%
counts: 10
avgCostTime1: 51ms
avgCostTime2: 25ms
avgCostTime3: 37ms
-------------------------
Processing 100%
counts: 100
avgCostTime1: 33ms
avgCostTime2: 17ms
avgCostTime3: 31ms
-------------------------
Processing 100%
counts: 1000
avgCostTime1: 39ms
avgCostTime2: 21ms
avgCostTime3: 37ms
-------------------------

 

Code:
   
   
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Reflection; 6 using System.IO; 7 8 9 namespace test 10 { 11 class Program 12 { 13 class StopWatch 14 { 15 private static int mintStart; 16 17 public static void Start() 18 { 19 mintStart = Environment.TickCount; 20 } 21 22 public static long Elapsed() 23 { 24 return Environment.TickCount - mintStart; 25 } 26 } 27 28 29 class MyFile 30 { 31 public static string search1( int lineNum, string queryString, string filePath) 32 { 33 StringBuilder stringBillder = new StringBuilder(); 34 FileStream fileStream = new FileStream(filePath, FileMode.Open); 35 StreamReader streamReader = new StreamReader(fileStream); 36 int currentLine = 1 ; 37 while ( - 1 != (streamReader.Peek())) 38 { 39 if (currentLine < lineNum) 40 { 41 currentLine ++ ; 42 continue ; 43 } 44 else 45 { 46 string tempLine = streamReader.ReadLine(); 47 stringBillder.Append(tempLine); 48 currentLine ++ ; 49 } 50 } 51 streamReader.Close(); 52 fileStream.Close(); 53 int tempIndex = stringBillder.ToString().IndexOf(queryString); 54 if (tempIndex != - 1 ) 55 { 56 return " Find! " + tempIndex; 57 } 58 else 59 { 60 return " Not Find! " ; 61 } 62 } 63 64 public static string search2( int lineNum, string queryString, string filePath) 65 { 66 FileStream fileStream = new FileStream(filePath, FileMode.Open); 67 StreamReader streamReader = new StreamReader(fileStream); 68 int currentLine = 1 ; 69 while ( - 1 != (streamReader.Peek())) 70 { 71 if (currentLine < lineNum) 72 { 73 currentLine ++ ; 74 continue ; 75 } 76 else 77 { 78 int tempIndex = streamReader.ReadLine().IndexOf(queryString); 79 if (tempIndex != - 1 ) 80 { 81 streamReader.Close(); 82 fileStream.Close(); 83 return " Find! Line " + currentLine + " cols " + tempIndex; 84 } 85 currentLine ++ ; 86 } 87 } 88 streamReader.Close(); 89 fileStream.Close(); 90 return " Not Find! " ; 91 } 92 93 public static string search3( int lineNum, string queryString, string filePath) 94 { 95 FileStream fileStream = File.Open(filePath, FileMode.Open); 96 StreamReader streamReader = new StreamReader(fileStream); 97 string log = streamReader.ReadToEnd(); 98 string [] arr = log.Split( new char [] { ' /r ' , ' /n ' }); 99 100 if (arr != null && arr.Length >= lineNum) 101 { 102 for ( int i = lineNum; i <= arr.Length; i ++ ) 103 { 104 int tempIndex = arr[i].IndexOf(queryString); 105 if (tempIndex != - 1 ) 106 { 107 streamReader.Close(); 108 fileStream.Close(); 109 return " Found! Line: " + i + " Cols: " + tempIndex; 110 } 111 } 112 } 113 else 114 { 115 return " Error! Can not find the line. " ; 116 } 117 streamReader.Close(); 118 fileStream.Close(); 119 return " Not Find! " ; 120 } 121 } 122 static void Main( string [] args) 123 { 124 string filePath = @" d:/WindowsUpdate.log " ; 125 long costTime1 = 0L ; 126 long costTime2 = 0L ; 127 long costTime3 = 0L ; 128 string result = null ; 129 const int counts1 = 10 ; 130 131 132 for ( int i = 0 ; i < 3 ; i ++ ) 133 { 134 int tempCount = ( int )Math.Pow(counts1, i + 1 ); 135 for ( int j = 0 ; j < tempCount; j ++ ) 136 { 137 StopWatch.Start(); 138 result = MyFile.search1( 800 , @" Process: C:/Windows/system32/svchost.exe " , filePath); 139 costTime1 += StopWatch.Elapsed(); 140 // Console.Out.WriteLine(result); 141 // Console.Out.WriteLine(costTime + "ms"); 142 143 StopWatch.Start(); 144 result = MyFile.search2( 800 , @" Process: C:/Windows/system32/svchost.exe " , filePath); 145 costTime2 += StopWatch.Elapsed(); 146 // Console.Out.WriteLine(result); 147 // Console.Out.WriteLine(costTime + "ms"); 148 149 StopWatch.Start(); 150 result = MyFile.search3( 800 , @" Process: C:/Windows/system32/svchost.exe " , filePath); 151 costTime3 += StopWatch.Elapsed(); 152 // Console.Out.WriteLine(result); 153 // Console.Out.WriteLine(costTime + "ms"); 154 Console.Write( " Processing {0}%/r " , (j + 1 ) * 100 / tempCount); 155 } 156 Console.Out.WriteLine( " /ncounts: " + tempCount); 157 Console.Out.WriteLine( " avgCostTime1: " + costTime1 / tempCount + " ms " ); 158 Console.Out.WriteLine( " avgCostTime2: " + costTime2 / tempCount + " ms " ); 159 Console.Out.WriteLine( " avgCostTime3: " + costTime3 / tempCount + " ms " ); 160 Console.Out.WriteLine( " ------------------------- " ); 161 } 162 163 164 165 Console.ReadLine(); 166 } 167 } 168 } 169
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值