java学习笔记——jsp简单⽅法读取txt⽂本数据
该⽅法不需要数据库和excel插件,程序简单,实现速度快。
⽬标:如下⾯的txt⽂档有200多个,每个txt⽂档都有20条不规则记录,需要将每个⽂档中的每条数据保存到excel中。
这些txt是从⽹站中保存下来的,由于⼀些⽹站要验证session和ip,所以不是很好实现⽹上抓取,就对下载下来的⽂本⽂件进⾏处理,以后再研究⽹上抓取的过程。
⽂本⽚段例⼦:
HIGHLY CITED PAPERS FOR (PEOPLES R CHINA)
Sorted by:  Citations Publication Year Journal Title
881 - 900 (of 6910)  [ 41 | 42 | 43 | 44 | 45  | 46 | 47 |
48 | 49 | 50 ]
Page 45 of 346
881    Citations: 3
Title:GEVREY HYPOELLIPTICITY FOR A CLASS OF KINETIC EQUATIONS
Authors:CHEN H;  LI WX;  XU CJ
Source:COMMUN PART DIFF EQUAT 36 (4): 693-728 2011
Addresses:Wuhan Univ, Sch Math & Stat, Wuhan 430072, Peoples R
China.
Univ Rouen, CNRS, UMR 6085, St Etienne, France.
Field:MATHEMATICS
882    Citations: 3
Title:HIGHER AUSLANDER ALGEBRAS ADMITTING TRIVIAL MAXIMAL ORTHOGONAL
SUBCATEGORIES
Authors:HUANG ZY;  ZHANG XJ
Source:J ALGEBRA 330 (1): 375-387 MAR 15 2011
Addresses:Nanjing Univ, Dept Math, Nanjing 210093, Jiangsu Prov,
Peoples R China.
Nanjing Univ Informat Sci & Technol, Coll Math & Phys, Nanjing
210044, Jiangsu Prov, Peoples R China.
Field:MATHEMATICS
883    Citations: 3
Title:PREDATOR-PREY SYSTEM WITH STRONG ALLEE EFFECT IN PREY
例⼦中红⾊字体为需要抽取的字段,遇到的问题有:
每⼀页都有多条记录,如何区分各个记录;
每个字段的⾏数都不⼀样,如何确定其⾏数。
解决⽅法:
⽤两次读取来解决问题
1、第⼀次读取,⽤readline()⽅法读取⽂本,⽤startWith()⽅法判断开头字符,如果为需要抽取的字段,则将其⾏号记录到该字段的数组中;
2、第⼆次读取,⽤for循环控制,每⼀次循环对于⼀条记录,判断⾏号是否和该字段数组中的记录相等,如果相等则读取⽂本,读到下⼀个字段的开头结束。
程序实现:
1 <%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
2 <%@ page import="java.util.*,java.io.*,*" %>
3
4<html>
5<body>
6
7<font size="4" face="arial" color="black">
8 <%
9
10 try{
11
12  // 读取的⽂件数dataNum
13for(int dataNum =45; dataNum<=262; dataNum++){
14
15String Class().getResource("/").getPath()+dataNum+".txt";
16    //out.println(txtpath);
17
18
19
20int lineNum=0;  //记录⾏数
21
22int [] citationsNum= new int[20];  //记录citations字段所在的⾏数
23int [] titleNum = new int[20];    //记录title字段所在的⾏数
24int [] authorNum= new int[20];    //记录author字段所在的⾏数
25int [] sourceNum  = new int[20];  //记录source字段所在的⾏数
26int [] addressesNum = new int[20];  //记录address字段所在的⾏数
27int [] fieldNum  = new int[20];    //记录field字段所在的⾏数
28
29    //记录上述每个字段数组的序号
30int  cNum=0;
31int  tNum=0;
32int  aNum=0;
33int  sNum=0;
34int  adNum=0;
35int  fNum=0;
36
37    Pattern p = Patternpile("Citations:");    //由于Citations不是开头,需要⽤正则表达式判断
38
39    //以⾏读取⽂件内容
40    BufferedReader br = new BufferedReader(new FileReader(txtpath));
41
42String record = new String();
43String inputText = null;
44while ((record = br.readLine()) != null) {
45
46              lineNum++; //读取⼀⾏⾏号+1
47
48              //记录citations⾏号
49              Matcher m = p.matcher(record);
50if(m.find()){
51                citationsNum [cNum++]= lineNum;
52              }
53
54              //记录title⾏号
55if((place("","")).startsWith("Title:")){
56                titleNum [tNum++]= lineNum;
57              }
58
59              //记录Author⾏号
60if((place("","")).startsWith("Authors:")){
61                authorNum [aNum++]= lineNum;
62              }
63
64              //记录Source⾏号
65if((place("","")).startsWith("Source:")){
66                sourceNum [sNum++]= lineNum;
67              }
68
69              //记录Address⾏号
70if((place("","")).startsWith("Addresses:")){
71                addressesNum [adNum++]= lineNum;
72              }
73
74              //记录Field⾏号
75if((place("","")).startsWith("Field:")){
76                fieldNum [fNum++]= lineNum;
77              }
78
79      } //第⼀次读取结束,每个字段的⾏号已经记录到数组中
80
81
82
83    //第⼆次读取开始,并输出表格
84
85String CitationsValue = new String(); //记录读取的字段的内容,下同
86String TitleValue = new String();
87String AuthorValue =new String();
88String SourceValue = new String();
89String AddressValue = new String();
90String fieldValue = new String();
91int lineNum2;//第⼆次读取时的⾏号
session如何设置和读取92
93          BufferedReader br2 =null;
94 %>
95
96<table border=1 cellspacing="0">
97
98 <%
99                      //因为每⼀个txt⽂件有20条记录
100for(int i=0; i < 20; i++){
101                            lineNum2=0;  //开始读取并初始化
102                            TitleValue = "";
103                                        AuthorValue ="";
104                                        SourceValue = "";
105                                        AddressValue ="";
106                                        fieldValue = "";
107                                        CitationsValue = "";
108                                        fieldValue = "";
109
110                              br2 = new BufferedReader(new FileReader(txtpath));
111while ((record = adLine()) != null) {
112
113                                  lineNum2++;
114
115if( lineNum2>= citationsNum[i] && lineNum2<titleNum[i]){  //根据citationsNum所处的位置读取116
117                              CitationsValue = CitationsValue+record;    //读取的值存到字段中
118                            }
119
120if( lineNum2>= titleNum[i] && lineNum2<authorNum[i]){
121
122                              TitleValue = TitleValue+record;
123                            }
124
125if( lineNum2>= authorNum[i] && lineNum2<sourceNum[i]){ 126
127                              AuthorValue = AuthorValue+record;
128                            }
129
130if( lineNum2>= sourceNum[i] && lineNum2<addressesNum[i]){ 131
132                              SourceValue = SourceValue+record;                            133                            }
134
135if( lineNum2 >= addressesNum[i]&& lineNum2<fieldNum[i]) { 136
137                              AddressValue = AddressValue+record;                            138                            }
139
140if( lineNum2 == fieldNum[i]) {
141
142                              fieldValue = fieldValue+record;
143                            }
144
145                        } //每⼀次循环都输出⼀次表格
146  %>
147
148<tr>
149<td><%=CitationsValue%></td>
150<td><%=TitleValue%></td>
151<td><%=AuthorValue%></td>
152<td><%=SourceValue%></td>
153<td><%=AddressValue%></td>
154<td><%=fieldValue%></td>
155</tr>
156
157 <%
158
159                } //读取结束,表格输出完毕
160
161 %>
162</table>
163 <%
164
165        br.close();
166        br2.close();
167
168  } // 所有⽂件的for循环结束
169
170 }catch(Exception e){
171    e.printStackTrace();
172 }
173
174 %>
175
176</font></p>
177
178</body>
179</html>
运⾏结果:
将上⾯表格内容复制到excel即可。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。