微博数据清洗(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. oracle 11g physical standby switchover

    简介 SWITCHOVERS主要是在计划停机维护时用来降低DOWNTIME,如硬件维护.操作系统升级或是数据库rolling upgrade, 也可用来进行特殊情况下的数据库迁移. SWITCHOVE ...

  2. 使用mocha测试

    学习了MOCHA官网的示例,将学习成果记录一下.[原文+例子:使用mocha测试] mocha是什么 Mocha是一个跑在node和浏览器上的javascript测试框架,让异步测试变得简单有趣, 并 ...

  3. UDP socket也可以使用connect系统调用

    UDP socket也可以使用connect系统调用 UDP是一个无连接的协议,因此socket函数connect()似乎对UDP是没有意义的,然而事实不是这样.它可以用来指定本地端口和本地地址,来建 ...

  4. HDU4626+博弈

    博弈... /* 博弈 对于当前人来说,如果完成自己的操作后,若mat[n][m]==0,则自己是胜者. 因为 如果mat其他位置不存在1了,肯定自己胜:如果存在1,则让下一位去反转那个1. */ # ...

  5. ant design pro (四)新增页面

    一.概述 参看地址:https://pro.ant.design/docs/new-page-cn 这里的『页面』指配置了路由,能够通过链接直接访问的模块,要新建一个页面,通常只需要在脚手架的基础上进 ...

  6. vue mixin使用

    1.概述 将一些公用方法引入到不同的组件中. 2.引入方式 (1)全局引入 // 注册全局Mixin Vue.mixin({ methods: { $touch: function() { // 用以 ...

  7. Tags Used In OpenERP 7.0

    In OpenERP 7.0. the form view of each object has been redesigned so that the object the user is work ...

  8. 关于flex,好像有12个属性非常重要

    关于Flex,有12个属性非常重要 这几天在学习Flex布局,发现Flex真的好厉害! Flex是Flexible Box的缩写,意为"弹性布局",用来为盒模型提供最大的灵活性. ...

  9. 转 redis使用场景 简介

    Redis实战(五) 聊聊Redis使用场景 发表于 2016-11-21 | 数据存储 | Redis 文章目录 1. 使用场景说明 1.1. 计数器 1.2. 排行榜 1.3. 用于存储时间戳 1 ...

  10. SQLSERVER中的timestamp 和 C#中的byte[] 转换

    项目中由于需求设计,数据库中需要一个timestamp时间戳类型的字段来作为区别数据添加和修改的标识.由于timestamp在SQL SERVER 2005数据库中,不可为空的timestamp类型在 ...