微博数据清洗(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. java学习笔记14--多线程编程基础1

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...

  2. uva 10518 - How Many Calls?(矩阵快速幂)

    题目链接:uva 10518 - How Many Calls? 公式f(n) = 2 * F(n) - 1, F(n)用矩阵快速幂求. #include <stdio.h> #inclu ...

  3. SSIS实践入门1:我的第一个SSIS程序开发

    深圳,和你见面已经有23天的时间了,第10天敲定了我人生中的第三份工作,虽说不是和想象中的工作那么好,但是我感觉我已经提前进入了备战状态,接下来我希望自己在你的领土可以有所发展,深圳,一个人多的城市, ...

  4. Kettle中根据一个输入行派生出多个输出行

    依然在北京,早上停电了,整个人感觉对不好了,接下来就说一下在使用ETL工具kettle做数据校验的时候遇到的一些问题,一级解决方案. 1:数据校验效果图下图: 原始表数据(需要校验的表数据) 对上表数 ...

  5. 安装Was liberty之步骤

    安装文件下载:http://pan.baidu.com/s/1dDl8PuL 安装三大步骤:拷贝文件,安装VNC和安装WasLiberty 拷贝文件是将需要的文件InstalMgr1.6.2_LNX_ ...

  6. 关于angularjs中路由页面强制更新的问题

    有这么一个问题,在页面内路由页面跳转时,第一次跳入路由页面时是正常的,但是第二次会记住第一次时的状态,有时候并不想这样,想强制更新这个路由页面. 有一种方式就是使用 ui-sref-opts功能,我试 ...

  7. eclipse插件之easyshell

    在eclipse marketplace可以找到这个插件,名字就是easyshell,下载安装完以后,可以通过配置快捷键实现: enjoy it.

  8. java中循环控制结构

    1. break结束break所在循环 for(i……) { for(j……) { break;  //结束循环j } } 2.带标签的break. java中的标签只用在循环语句前面. outer: ...

  9. 使用JavaMelody监控tomcat以及jvm

    JavaMelody用于对Java应用或者应用服务器的QA以及开发环境的监控.它并不是一个模拟请求类似JMeter的压力测试工具,而是一个衡量并且计算在应用上的操作信息的工具,也就是说,它只负责对行为 ...

  10. Android 混淆打包不混淆第三方jar包

    项目由于要公布,所以要混淆打包. 混淆打包流程: 1.在proguard-project.txt文件里加入不须要混淆的类和第三方的jar包   这个是保持自己包中不须要混淆的类,假设有些类调用了jni ...