微博excel数据清洗(Java版)
微博数据清洗(Java版)
- 2979
大数据公益大学提供的一份数据,义务处理一下,原始数据是Excel,含有html标签,如下:
要求清洗掉html标签,和微博内容中的url地址。
主要分为两部分:
1.处理文本,清洗数据。
2.处理excel读写操作。
上代码:
ExcelUtil类,包含Excel2003-2007的读写操作,Excel使用Apache POI进行操作,需要jar包如下:
- package dat.datadeal;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import java.util.Locale;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import org.apache.poi.hssf.usermodel.HSSFCell;
- import org.apache.poi.hssf.usermodel.HSSFCellStyle;
- import org.apache.poi.hssf.usermodel.HSSFRow;
- import org.apache.poi.hssf.usermodel.HSSFSheet;
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
- import org.apache.poi.ss.usermodel.Cell;
- import org.apache.poi.ss.usermodel.DateUtil;
- import org.apache.poi.ss.usermodel.Row;
- import org.apache.poi.ss.usermodel.Sheet;
- import org.apache.poi.ss.usermodel.Workbook;
- import org.apache.poi.xssf.usermodel.XSSFWorkbook;
- /**
- *
- * @author daT dev.tao@gmail.com
- *2003,2007版excel读写工具
- */
- public class ExcelUtil{
- /**
- * Excel文件读取
- * @param filePath
- * @return String[]存的是行,List存的是列。
- * 一个excel一次全部读入内存(Excel超大需要另行处理)
- */
- public List<String[]> readExcel(String filePath) {
- List<String[]> dataList = new ArrayList<String[]>();
- boolean isExcel2003 = true;
- if (isExcel2007(filePath)) {
- isExcel2003 = false;
- }
- File file = new File(filePath);
- InputStream is = null;
- try {
- is = new FileInputStream(file);
- } catch (FileNotFoundException ex) {
- Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex);
- }
- Workbook wb = null;
- try {
- wb = isExcel2003 ? new HSSFWorkbook(is) : new XSSFWorkbook(is);
- } catch (IOException ex) {
- Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex);
- }
- Sheet sheet = wb.getSheetAt(0);
- int totalRows = sheet.getPhysicalNumberOfRows();
- int totalCells = 0;
- if (totalRows >= 1 && sheet.getRow(0) != null) {
- totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
- }
- for (int r = 0; r < totalRows; r++) {
- Row row = sheet.getRow(r);
- if (row == null) {
- continue;
- }
- String[] rowList = new String[totalCells];
- for (int c = 0; c < totalCells; c++) {
- Cell cell = row.getCell(c);
- String cellValue = "";
- if (cell == null) {
- rowList[c] = (cellValue);
- continue;
- }
- cellValue = ConvertCellStr(cell, cellValue);
- rowList[c] = (cellValue);
- }
- dataList.add(rowList);
- }
- return dataList;
- }
- private String ConvertCellStr(Cell cell, String cellStr) {
- switch (cell.getCellType()) {
- case Cell.CELL_TYPE_STRING:
- // 读取String
- cellStr = cell.getStringCellValue().toString();
- break;
- case Cell.CELL_TYPE_BOOLEAN:
- // 得到Boolean对象的方法
- cellStr = String.valueOf(cell.getBooleanCellValue());
- break;
- case Cell.CELL_TYPE_NUMERIC:
- // 先看是否是日期格式
- if (DateUtil.isCellDateFormatted(cell)) {
- // 读取日期格式
- cellStr = formatTime(cell.getDateCellValue().toString());
- } else {
- // 读取数字
- cellStr = String.valueOf(cell.getNumericCellValue());
- }
- break;
- case Cell.CELL_TYPE_FORMULA:
- // 读取公式
- cellStr = cell.getCellFormula().toString();
- break;
- }
- return cellStr;
- }
- private boolean isExcel2007(String fileName) {
- return fileName.matches("^.+\\.(?i)(xlsx)$");
- }
- private String formatTime(String s) {
- SimpleDateFormat sf = new SimpleDateFormat("EEE MMM dd hh:mm:ss z yyyy", Locale.ENGLISH);
- Date date = null;
- try {
- date = sf.parse(s);
- } catch (ParseException ex) {
- Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex);
- }
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- String result = sdf.format(date);
- return result;
- }
- /**
- * Excel写操作,简单起见还是采用内存数据一次写入
- * @param filePath 输出文件路径名
- * @param dataList 输出文件内容,List<String>行 List列
- * @throws IOException
- */
- public void writeExcel(String filePath,List<List<String>> dataList) throws IOException{
- HSSFWorkbook wb = new HSSFWorkbook();
- HSSFSheet sheet = wb.createSheet("sheet");// 添加sheet
- // 表格样式
- HSSFCellStyle style = wb.createCellStyle();
- style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 指定单元格居中对齐
- // // 边框
- // style.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM);
- // style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM);
- // style.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM);
- // style.setBorderRight(HSSFCellStyle.BORDER_MEDIUM);
- // //设置字体
- // HSSFFont f = wb.createFont();
- // f.setFontHeightInPoints((short)10);
- // f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
- // style.setFont(f);
- // //设置列宽
- // sheet.setColumnWidth((short)0, (short)9600);
- // sheet.setColumnWidth((short)1, (short)4000);
- // sheet.setColumnWidth((short)2, (short)8000);
- // sheet.setColumnWidth((short)3, (short)8000);
- // 在索引0的位置创建第一行
- for (int i = 0; i < dataList.size(); i++) {
- HSSFRow row = sheet.createRow(i);
- List<String> list = dataList.get(i);
- for (int j = 0; j < list.size(); j++) {
- HSSFCell cell = row.createCell(j);
- cell.setCellValue(list.get(j));
- cell.setCellStyle(style);
- }
- }
- // 导出文件
- FileOutputStream fout = new FileOutputStream(filePath);
- wb.write(fout);
- fout.close();
- }
- }
DataClean类,包含对html标签,信息中url的的清洗。
- package dat.datadeal;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- /**
- *
- * @author daT dev.tao@gmail.com
- *
- */
- public class DataClean {
- /**
- * 清洗html标签
- * @param inputString
- * @return
- */
- public static String delHtml(String inputString) {
- String htmlStr = inputString; // 含html标签的字符串
- String textStr = "";
- java.util.regex.Pattern p_script;
- java.util.regex.Matcher m_script;
- java.util.regex.Pattern p_html;
- java.util.regex.Matcher m_html;
- try {
- String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式
- String regEx_script = "<[/s]*?script[^>]*?>[/s/S]*?<[/s]*?//[/s]*?script[/s]*?>"; // 定义script的正则表达式{或<script[^>]*?>[/s/S]*?<//script>
- p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
- m_script = p_script.matcher(htmlStr);
- htmlStr = m_script.replaceAll(""); // 过滤script标签
- p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
- m_html = p_html.matcher(htmlStr);
- htmlStr = m_html.replaceAll(""); // 过滤html标签
- textStr = htmlStr;
- } catch (Exception e) {
- System.err.println("Html2Text: " + e.getMessage());
- }
- return textStr;// 返回文本字符串
- }
- /**
- * 处理掉信息中的url地址
- */
- public static String dealWithUrl(String str){
- String regEx = "[http|https]+[://]+[0-9A-Za-z:/[-]_#[?][=][.][&]]*";
- Pattern p = Pattern.compile(regEx);
- Matcher m = p.matcher(str);
- return m.replaceAll("");
- }
- public static void main(String[] args) throws IOException{
- ExcelUtil excelUtil = new ExcelUtil();
- List<List<String>> writeList = new ArrayList<List<String>>();
- List<String[]> readList =excelUtil.readExcel("/home/dat/javatest/微博数据_.xlsx");
- for(String[] lineArray:readList){
- List<String> strList = new ArrayList<String>();
- for(String str:lineArray){
- String strTmp = DataClean.dealWithUrl(DataClean.delHtml(str));
- strList.add(strTmp);
- //System.out.println(strTmp);
- }
- writeList.add(strList);
- }
- excelUtil.writeExcel("/home/dat/javatest/weibo.xlsx",writeList);
- System.out.println("job has finished...........");
- }
- }
清洗后数据:
微博excel数据清洗(Java版)的更多相关文章
- 如何做系列(4)-微博URL短网址生成算法原理(java版、php版实现实例)
短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代 ...
- 微博地址url(id)与mid的相互转换 Java版
原理: 新浪微博的URL都是如:http://weibo.com/2480531040/z8ElgBLeQ这样三部分. 第一部分(绿色部分)为新浪微博的域名,第二部分(红色部分)为博主Uid,第三部分 ...
- 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容
第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...
- 第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备
相信很多人或多或少听说了微信公众平台的火热.但是开发还是有一点门槛,鉴于挺多朋友问我怎么开发,问多了,自己平时也进行以下总结.所以下面给大家分享一下我的经验: 微信公众号是什么? 官网的介绍:再小的个 ...
- ArcGIS Server 10 Java 版的Rest服务手动配置方法
Java版的Manager中发布的服务默认只发布了该服务的SOAP接口,而REST接口需要用户在信息服务器,如Tomcat. Apache.WebLogic等中手工配置.由于在Java版的Server ...
- PetaPojo —— JAVA版的PetaPoco
背景 由于工作的一些原因,需要从C#转成JAVA.之前PetaPoco用得真是非常舒服,在学习JAVA的过程中熟悉了一下JAVA的数据组件: MyBatis 非常流行,代码生成也很成熟,性能也很好.但 ...
- 【转载】java版打字练习软件
网上找到一个java版的打字的游戏 import java.applet.Applet; import java.applet.AudioClip; import java.awt.Dimension ...
- JCEF3——谷歌浏览器内核Java版实现(一):使用jawt获取窗体句柄
前言 最近一段时间研究谷歌浏览器内核.谷歌浏览器内核一直开源,并维护更新,它的开源项目中内核更新速度和Chrome浏览器版本更新进度一样!而且它不同于WebKit(值得一题的是谷歌浏览器已不使用Web ...
- Selenium关键字驱动测试框架Demo(Java版)
Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html
随机推荐
- JAVA反射使用手记
本篇文章为在工作中使用JAVA反射的经验总结,也可以说是一些小技巧,以后学会新的小技巧,会不断更新.本文不准备讨论JAVA反射的机制,网上有很多,大家随便google一下就可以了. 在开始之前,我先定 ...
- Linux 安装tomcat 及过程中遇到的问题
Linux 安装tomcat(tomcat能用的前提是系统已经安装jdk) 1.下载linux系统版tomcat,解压后通过ftp上传到Linux服务器 例:tomcat放在 /opt/tom ...
- 算法笔记_142:无向图的欧拉回路求解(Java)
目录 1 问题描述 2 解决方案 1 问题描述 John's trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8 ...
- QtGui.QCheckBox
A QtGui.QCheckBox is a widget that has two states: on and off. It is a box with a label. Check boxes ...
- Python 访问dict
访问dict 1:可以if判断元素是否存在 2:dict.get('key')我们已经能创建一个dict,用于表示名字和成绩的对应关系:d = { 'Adam': 95, 'Lisa': 85, 'B ...
- 有关索引的DMV(转)
转自:http://www.cnblogs.com/CareySon/archive/2012/05/17/2505981.html 1.查看那些被大量更新,却很少被使用的索引 SET TRANSAC ...
- Linux环境下GNU, GCC, G++编译器(转)
一,GNU GNU是“GNU 's Not Unix”的递归缩写, Stallman宣布GNU应当发音为Guh-NOO(革奴)以避免与new这个单词混淆(注:Gnu在英文中原意为非洲牛羚,发音与new ...
- js 给json添加新的字段,或者添加一组数据,在JS数组指定位置删除、插入、替换元素
JS定义了一个json数据var test={name:"name",age:"12"};需要给test再添加一个字段,需要什么办法,可以让test的值为{na ...
- DBCP(一)数据源配置文件
DBCP是Apache开发的数据源API,使用的话需要导入dbcp jar包.collections jar包.pool jar包. 其数据源匹配的配置文件格式如下: #连接设置 driverCl ...
- udp套接字使用信号驱动式I/O
信号驱动式I/O的本质就是:进程预先告知内核当某个描写叙述符发生事件时,内核会向该进程发送SIGIO信号通知进程,进程可在信号处理函数中进行处理 进程能够通过fcntl打开O_ASYNC标志或ioct ...