公司需要一个统计一下一个txt文本中 黑体字部分不同数据出现的次数 ,把结果做成excel文件交上去。txt内容就像下面的:
想了一下大概涉及这几个方面:1.黑体字的提取 2.黑体字的去重 3.出现次数的统计
涌入脑中的方案有三个:
a.直接上java代码,用IO流处理文本,逐行获取后截取字符串,在进行重复的逻辑判断,同时记录下来出现了多少次------太麻烦
b.截取字符串后,存到数据库中,使用distinct和count函数处理-----也麻烦
c.直接逐行写入excel,再进行excel方面的处理-----这个还不错,因为a和b最后还是需要记录到excel中
决定后考虑了下总体的逻辑,如下:
第一部分:txt到xls
/*
* 需求:把txt文件按照每行内容写入excel文件
* 步骤:
* 1.读取txt文件----getTxt方法
* 2.创建excel文件,创建sheet----getFactory方法
* 3.创建row,循环创建cell,并把内容写入---writeTxtToExcel方法
*/
第二部分:xls操作
/*
* 需求:统计不同数据的出现次数
* 步骤:
* 1.分裂出黑体字部分
* 2.去除重复
* 3.统计出现次数
*/
过程下来还是挺快的,就是有些小坑
第一部分详细:
获取txt方法
//读取txt文件
public BufferedReader getTxt(String txtPath){
try {
File file = new File(txtPath);
BufferedReader br = new BufferedReader(new FileReader(file));
return br;
} catch (Exception e) {
System.out.println("解析txt文件有误");
e.printStackTrace();
}
return null;
}
创建xls中的factory方法-----引入的是poi-ooxml包,3.15版本。处理excel不止这一种包
//创建excel文件中的factory
public Workbook getFactory(String excelPath){
Workbook book = null;
try {
book = new HSSFWorkbook();
} catch (Exception e) {
System.out.println("创建excel文件失败");
e.printStackTrace();
}
return book;
}
内容写入writeTxtToExcel方法
//创建row,循环创建cell,并把内容写入
public void writeTxtToExcel(String txtPath,String excelPath){
try {
BufferedReader br = getTxt(txtPath);
String str = null;
int index = 0;//标记excel文件写入时的换行
Workbook factory = getFactory(excelPath);
Sheet sheet = factory.createSheet();
sheet.setColumnWidth(0,50*256);//设置列宽---50个字符宽
//把读取到的每行数据写入sheet
while((str = br.readLine()) != null){//逐行读取,判断的同时赋值
Cell cell = sheet.createRow(index).createCell(0);//写入第一列的所有行
if(StringUtils.isNotEmpty(str)){
System.out.println(str);
cell.setCellValue(str);
}
index++;
}
//把sheet写入excel文件
OutputStream os = new FileOutputStream(excelPath);
factory.write(os);
os.close();
} catch (Exception e) {
System.out.println("内容写入失败");
e.printStackTrace();
}
}
这个方法中有个问题还没搞明白:逐行读取的str值set进cell中之前有个判断,打印出来的str结果是不包含空行的,但是写入excel的数据死活都有空行,试了很多遍都不行
当然了,也可以再写一些方法,比如:给数据插入标题,单元格样式设置等等。上头等着要数据,我就没弄。
测试方法:我是使用的spring提供的测试。用main方法也行,但是方法注意static关键字
@Test
public void test02(){
String txtPath = "d:/lung/openID.txt";//已存在的txt文件路径
String excelPath = "d:/lung/openID.xls";//要创建的excel文件路径
writeTxtToExcel(txtPath, excelPath);
System.out.println("写入完毕");
}
这里说明一下,我创建的格式是xls格式。如果是xlsx格式,offer打开报错,使用wps两种都可以打开,说是offer版本的问题
结果如图:
至此,从txt写数据到excel的功能实现了。
----------------------------------------------------------------------------------------------------------------------------------------
第二部分详细:
去除空行:
我使用的是比较笨的方法:找的excel中的“筛选”--->只选择 “空白”,如图:
空白行已经单独标出来了,选中这些行,删除行就行了
分裂出黑体部分:
选中A列,找到“数据”中的“分列”---->“分隔符号”--->”其他“,输入” . “。因为数据中的黑体部分正好有个” . “。然后删除A列就行了
去除重复:
复制这些数据到隔壁列B列,选中B列后,找到 “去除重复值”,确定即可
统计出现次数:
在C1格输入 “=countif(a1:a41,b1)”------说明:countif方法,两个参数:原始数据的开始和结束位置;要找出现次数的数据所在位置。回车
复制C1格后,选中C列,右键选中 粘贴中的 “选择性粘贴”--->“公式”即可
最后手动加个标题就好看些
至此,数据的统计工作也完成了
总结:
1.读取和写入文件时,最好路径名命名清楚,不然容易混淆
2.如果想再往已经有数据的excel中添加数据,只要稍加修改writeTxtToExcel方法即可
3.其他的好像没什么了
LG