今天来复习赵老师讲过的旧知识!
知识点:文件的按行读写、正则提取组。
这次我加了详细的注释,完全就是面向过程,跟着思路一步一步走的,其实写程序就是跟着思路来,有思路,就有代码!非C#玩家应该也能看得懂。(注:C#中的using块的作用是自动释放非托管资源。)
这段演示代码的用途是把大街网上的求职信息的单位名称和链接地址按照一定格式提取到一个文本文件里。假设页面是“1.htm”、输出为“1.txt”(实际应用中不会写死的),效果是编号-名称-地址-换行,如下:
7.名称:某某某公司招聘某某某职位
地址:http://job.dajie.com/xxxxx.html
代码:
1 //首先要读取文件,建立一个文件流来读取
2 using (FileStream fs = File.OpenRead("1.htm"))
3 {
4 //由于一个标签就是一行,所以用StreamReader来按行读取
5 using (StreamReader sr = new StreamReader(fs))
6 {
7 //我们要收集所有信息到一个集合里,建立一个集合
8 List<string> lines = new List<string>();
9
10 //这里是正则匹配的字符串,第一个组是连接,第二个组是名称,这个字符串是匹配大街网的
11 string reg = "[^<p>]<a href=\"(.*)\" onmousedown=\"return c.*\">(.*)</a>";
12
13 //看读没读到文件结尾,读取每一行
14 while (!sr.EndOfStream)
15 {
16 //读取下一行
17 string line = sr.ReadLine();
18
19 //如果匹配成功
20 if (Regex.IsMatch(line, reg))
21 {
22 //则收集匹配到的信息到Match变量中
23 Match match = Regex.Match(line, reg);
24 //拼接结果字符串
25 string result = string.Format("名称:{0}\r\n地址:{1}", match.Groups[2], match.Groups[1]);
26 //把结果加入到最终的集合里
27 lines.Add(result);
28 }
29 }//读取每一行,循环结束
30
31 //读完了之后要写入目标文件,先建立一个
32 using (FileStream fs2 = File.Create("1.txt"))
33 {
34 //由于是按行写的,所以使用StreamWriter
35 using (StreamWriter sw = new StreamWriter(fs2))
36 {
37 //循环集合里的每一行
38 for (int i=0; i<lines.Count; i++)
39 {
40 //加上标号和换行,写进目标文件
41 sw.WriteLine((i+1)+"."+lines[i]+"\r\n");
42 }
43 }
44 }
45 }
46 }