文件指定行后查找字符串

问题:

在一个文件的自定行(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
-------------------------

 

ContractedBlock.gif ExpandedBlockStart.gif 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

 

转载于:https://www.cnblogs.com/reyesyang/archive/2010/04/16/1713511.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值