微博数据清洗(Java版)

原创 2013年12月10日 10:58:24
  • 2979

大数据公益大学提供的一份数据,义务处理一下,原始数据是Excel,含有html标签,如下:

 

要求清洗掉html标签,和微博内容中的url地址。

主要分为两部分:

1.处理文本,清洗数据。

2.处理excel读写操作。

上代码:

ExcelUtil类,包含Excel2003-2007的读写操作,Excel使用Apache POI进行操作,需要jar包如下:


  1. package dat.datadeal;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.text.ParseException;
  9. import java.text.SimpleDateFormat;
  10. import java.util.ArrayList;
  11. import java.util.Date;
  12. import java.util.List;
  13. import java.util.Locale;
  14. import java.util.logging.Level;
  15. import java.util.logging.Logger;
  16. import org.apache.poi.hssf.usermodel.HSSFCell;
  17. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  18. import org.apache.poi.hssf.usermodel.HSSFRow;
  19. import org.apache.poi.hssf.usermodel.HSSFSheet;
  20. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  21. import org.apache.poi.ss.usermodel.Cell;
  22. import org.apache.poi.ss.usermodel.DateUtil;
  23. import org.apache.poi.ss.usermodel.Row;
  24. import org.apache.poi.ss.usermodel.Sheet;
  25. import org.apache.poi.ss.usermodel.Workbook;
  26. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  27. /**
  28. *
  29. * @author daT dev.tao@gmail.com
  30. *2003,2007版excel读写工具
  31. */
  32. public class ExcelUtil{
  33. /**
  34. * Excel文件读取
  35. * @param filePath
  36. * @return String[]存的是行,List存的是列。
  37. * 一个excel一次全部读入内存(Excel超大需要另行处理)
  38. */
  39. public  List<String[]> readExcel(String filePath) {
  40. List<String[]> dataList = new ArrayList<String[]>();
  41. boolean isExcel2003 = true;
  42. if (isExcel2007(filePath)) {
  43. isExcel2003 = false;
  44. }
  45. File file = new File(filePath);
  46. InputStream is = null;
  47. try {
  48. is = new FileInputStream(file);
  49. } catch (FileNotFoundException ex) {
  50. Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex);
  51. }
  52. Workbook wb = null;
  53. try {
  54. wb = isExcel2003 ? new HSSFWorkbook(is) : new XSSFWorkbook(is);
  55. } catch (IOException ex) {
  56. Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex);
  57. }
  58. Sheet sheet = wb.getSheetAt(0);
  59. int totalRows = sheet.getPhysicalNumberOfRows();
  60. int totalCells = 0;
  61. if (totalRows >= 1 && sheet.getRow(0) != null) {
  62. totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
  63. }
  64. for (int r = 0; r < totalRows; r++) {
  65. Row row = sheet.getRow(r);
  66. if (row == null) {
  67. continue;
  68. }
  69. String[] rowList = new String[totalCells];
  70. for (int c = 0; c < totalCells; c++) {
  71. Cell cell = row.getCell(c);
  72. String cellValue = "";
  73. if (cell == null) {
  74. rowList[c] = (cellValue);
  75. continue;
  76. }
  77. cellValue = ConvertCellStr(cell, cellValue);
  78. rowList[c] = (cellValue);
  79. }
  80. dataList.add(rowList);
  81. }
  82. return dataList;
  83. }
  84. private String ConvertCellStr(Cell cell, String cellStr) {
  85. switch (cell.getCellType()) {
  86. case Cell.CELL_TYPE_STRING:
  87. // 读取String
  88. cellStr = cell.getStringCellValue().toString();
  89. break;
  90. case Cell.CELL_TYPE_BOOLEAN:
  91. // 得到Boolean对象的方法
  92. cellStr = String.valueOf(cell.getBooleanCellValue());
  93. break;
  94. case Cell.CELL_TYPE_NUMERIC:
  95. // 先看是否是日期格式
  96. if (DateUtil.isCellDateFormatted(cell)) {
  97. // 读取日期格式
  98. cellStr = formatTime(cell.getDateCellValue().toString());
  99. } else {
  100. // 读取数字
  101. cellStr = String.valueOf(cell.getNumericCellValue());
  102. }
  103. break;
  104. case Cell.CELL_TYPE_FORMULA:
  105. // 读取公式
  106. cellStr = cell.getCellFormula().toString();
  107. break;
  108. }
  109. return cellStr;
  110. }
  111. private boolean isExcel2007(String fileName) {
  112. return fileName.matches("^.+\\.(?i)(xlsx)$");
  113. }
  114. private String formatTime(String s) {
  115. SimpleDateFormat sf = new SimpleDateFormat("EEE MMM dd hh:mm:ss z yyyy", Locale.ENGLISH);
  116. Date date = null;
  117. try {
  118. date = sf.parse(s);
  119. } catch (ParseException ex) {
  120. Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex);
  121. }
  122. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  123. String result = sdf.format(date);
  124. return result;
  125. }
  126. /**
  127. * Excel写操作,简单起见还是采用内存数据一次写入
  128. * @param filePath 输出文件路径名
  129. * @param dataList 输出文件内容,List<String>行  List列
  130. * @throws IOException
  131. */
  132. public  void writeExcel(String filePath,List<List<String>> dataList) throws IOException{
  133. HSSFWorkbook wb = new HSSFWorkbook();
  134. HSSFSheet sheet = wb.createSheet("sheet");// 添加sheet
  135. // 表格样式
  136. HSSFCellStyle style = wb.createCellStyle();
  137. style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 指定单元格居中对齐
  138. // // 边框
  139. // style.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM);
  140. // style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM);
  141. // style.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM);
  142. // style.setBorderRight(HSSFCellStyle.BORDER_MEDIUM);
  143. // //设置字体
  144. // HSSFFont f = wb.createFont();
  145. // f.setFontHeightInPoints((short)10);
  146. // f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
  147. // style.setFont(f);
  148. // //设置列宽
  149. // sheet.setColumnWidth((short)0, (short)9600);
  150. // sheet.setColumnWidth((short)1, (short)4000);
  151. // sheet.setColumnWidth((short)2, (short)8000);
  152. // sheet.setColumnWidth((short)3, (short)8000);
  153. // 在索引0的位置创建第一行
  154. for (int i = 0; i < dataList.size(); i++) {
  155. HSSFRow row = sheet.createRow(i);
  156. List<String> list = dataList.get(i);
  157. for (int j = 0; j < list.size(); j++) {
  158. HSSFCell cell = row.createCell(j);
  159. cell.setCellValue(list.get(j));
  160. cell.setCellStyle(style);
  161. }
  162. }
  163. // 导出文件
  164. FileOutputStream fout = new FileOutputStream(filePath);
  165. wb.write(fout);
  166. fout.close();
  167. }
  168. }

DataClean类,包含对html标签,信息中url的的清洗。

  1. package dat.datadeal;
  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.regex.Matcher;
  6. import java.util.regex.Pattern;
  7. /**
  8. *
  9. * @author daT dev.tao@gmail.com
  10. *
  11. */
  12. public class DataClean {
  13. /**
  14. * 清洗html标签
  15. * @param inputString
  16. * @return
  17. */
  18. public static String delHtml(String inputString) {
  19. String htmlStr = inputString; // 含html标签的字符串
  20. String textStr = "";
  21. java.util.regex.Pattern p_script;
  22. java.util.regex.Matcher m_script;
  23. java.util.regex.Pattern p_html;
  24. java.util.regex.Matcher m_html;
  25. try {
  26. String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式
  27. String regEx_script = "<[/s]*?script[^>]*?>[/s/S]*?<[/s]*?//[/s]*?script[/s]*?>"; // 定义script的正则表达式{或<script[^>]*?>[/s/S]*?<//script>
  28. p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
  29. m_script = p_script.matcher(htmlStr);
  30. htmlStr = m_script.replaceAll(""); // 过滤script标签
  31. p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
  32. m_html = p_html.matcher(htmlStr);
  33. htmlStr = m_html.replaceAll(""); // 过滤html标签
  34. textStr = htmlStr;
  35. } catch (Exception e) {
  36. System.err.println("Html2Text: " + e.getMessage());
  37. }
  38. return textStr;// 返回文本字符串
  39. }
  40. /**
  41. * 处理掉信息中的url地址
  42. */
  43. public static String dealWithUrl(String str){
  44. String regEx = "[http|https]+[://]+[0-9A-Za-z:/[-]_#[?][=][.][&]]*";
  45. Pattern p = Pattern.compile(regEx);
  46. Matcher m = p.matcher(str);
  47. return m.replaceAll("");
  48. }
  49. public static void main(String[] args) throws IOException{
  50. ExcelUtil excelUtil = new ExcelUtil();
  51. List<List<String>> writeList = new ArrayList<List<String>>();
  52. List<String[]> readList =excelUtil.readExcel("/home/dat/javatest/微博数据_.xlsx");
  53. for(String[] lineArray:readList){
  54. List<String> strList = new ArrayList<String>();
  55. for(String str:lineArray){
  56. String strTmp = DataClean.dealWithUrl(DataClean.delHtml(str));
  57. strList.add(strTmp);
  58. //System.out.println(strTmp);
  59. }
  60. writeList.add(strList);
  61. }
  62. excelUtil.writeExcel("/home/dat/javatest/weibo.xlsx",writeList);
  63. System.out.println("job has finished...........");
  64. }
  65. }

清洗后数据:

微博excel数据清洗(Java版)的更多相关文章

  1. 如何做系列(4)-微博URL短网址生成算法原理(java版、php版实现实例)

    短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代 ...

  2. 微博地址url(id)与mid的相互转换 Java版

    原理: 新浪微博的URL都是如:http://weibo.com/2480531040/z8ElgBLeQ这样三部分. 第一部分(绿色部分)为新浪微博的域名,第二部分(红色部分)为博主Uid,第三部分 ...

  3. 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容

    第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...

  4. 第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备

    相信很多人或多或少听说了微信公众平台的火热.但是开发还是有一点门槛,鉴于挺多朋友问我怎么开发,问多了,自己平时也进行以下总结.所以下面给大家分享一下我的经验: 微信公众号是什么? 官网的介绍:再小的个 ...

  5. ArcGIS Server 10 Java 版的Rest服务手动配置方法

    Java版的Manager中发布的服务默认只发布了该服务的SOAP接口,而REST接口需要用户在信息服务器,如Tomcat. Apache.WebLogic等中手工配置.由于在Java版的Server ...

  6. PetaPojo —— JAVA版的PetaPoco

    背景 由于工作的一些原因,需要从C#转成JAVA.之前PetaPoco用得真是非常舒服,在学习JAVA的过程中熟悉了一下JAVA的数据组件: MyBatis 非常流行,代码生成也很成熟,性能也很好.但 ...

  7. 【转载】java版打字练习软件

    网上找到一个java版的打字的游戏 import java.applet.Applet; import java.applet.AudioClip; import java.awt.Dimension ...

  8. JCEF3——谷歌浏览器内核Java版实现(一):使用jawt获取窗体句柄

    前言 最近一段时间研究谷歌浏览器内核.谷歌浏览器内核一直开源,并维护更新,它的开源项目中内核更新速度和Chrome浏览器版本更新进度一样!而且它不同于WebKit(值得一题的是谷歌浏览器已不使用Web ...

  9. Selenium关键字驱动测试框架Demo(Java版)

    Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html

随机推荐

  1. Spring定时器多定时任务配置

    spring-task.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...

  2. 大端和小端(Big endian and Little endian)

    一.大端和小端的问题 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian 则相反,它 ...

  3. reportservice报表单元格依据条件显示不同的颜色

    有时候.我们须要依据条件,让单元格显示不同的颜色: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveV9mMTIz/font/5a6L5L2T/fontsi ...

  4. 【pyhon】nvshens图片批量下载爬虫

    代码: # nvshens图片批量下载爬虫 from bs4 import BeautifulSoup import requests import time import urllib.reques ...

  5. Python写的简陋版一对一聊天工具,全双工

    好该睡觉了,明天还要上班~~~直接上代码,后面再总结 import threading import os import socket def RecvProcess ( UDP_Socket, Lo ...

  6. Mysqldump参数大全(参数来源于mysql5.5.19源码)

    参数 参数说明 --all-databases  , -A 导出全部数据库. mysqldump  -uroot -p --all-databases --all-tablespaces  , -Y ...

  7. Caused by: java.lang.NumberFormatException: For input string: &quot;&quot;

    1.错误描写叙述 java.lang.NumberFormatException: For input string: "" at java.lang.NumberFormatEx ...

  8. OpenERP 源码变更后数据库升级

    转自:http://vivianyw.blog.163.com/blog/static/13454742220142114422130/?latestBlog OpenERP代码升级后需要对数据进行升 ...

  9. git gui :Updating the Git index failed. A rescan will be automatically started to res

    这个是由于unix系统的换行符和windows的换行符不一致造成的结果.你在安装git的时候,设置了成使用LF,即unix换行符,可是你是在windows下进行文件编辑的,所以会出现上面的警告.其实这 ...

  10. 基于canvas的原生JS时钟效果

    概述 运用html5新增画布canvas技术,绘制时钟效果,无需引用任何插件,纯js. 详细 代码下载:http://www.demodashi.com/demo/11935.html 给大家介绍一个 ...