微博数据清洗(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. mysql的日志管理

    日志操作是数据库维护中最重要的手段之一,日志文件会记录MySQL服务器的各种信息,所以当MySQL服务器遭到意外损坏时,不仅可以通过日志文件来查看出错的原因,而且还可以通过日志文件进行数据恢复. MY ...

  2. 如何快速访问MSDN某一个类或方法的帮助文档

    如何快速访问MSDN某一个类或方法的帮助文档? 我一般都是在Google上搜索的如"string msdn",而不是在Msdn上直接查找(你不可能知道所有的类或方法的完整命名空间) ...

  3. (LeetCode 72)Edit Distance

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...

  4. SQL2005 镜像配置

    新添加了一台服务器,做原来服务器的备份机,用交叉线+双网卡配置了内网. 系统环境:Windows 2008 R2 数据库:SQL2005 SP3   设置镜像可以用证书和域两种情况,不过域设置的权限比 ...

  5. Discuz常见小问题-如何禁止用户发言,快速删除某个用户的所有帖子

    用户-用户组,勾选批量编辑,然后点击批量编辑的链接   点击论坛相关-帖子相关,然后把指定用户组的允许发新话题设置为否,拉到底部,点击提交   以一个普通用户重新登录,尝试发帖报错,说明已经设置成功 ...

  6. Android下文件的压缩和解压(Zip格式)

    Zip文件结构 ZIP文件结构如下图所示, File Entry表示一个文件实体,一个压缩文件中有多个文件实体. 文件实体由一个头部和文件数据组,Central Directory由多个File he ...

  7. Python 创建包含列表的元组

    “可变”的tuple前面我们看到了tuple一旦创建就不能修改.现在,我们来看一个“可变”的tuple:>>> t = ('a', 'b', ['A', 'B'])注意到 t 有 3 ...

  8. 转:函数指针数组的妙用(I)

    转自:http://blog.sina.com.cn/s/blog_4c78b35f010008hi.html 笔者在开发某软件过程中遇到这样一个问题,前级模块传给我二进制数据,输入参数为 char* ...

  9. iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)

    简介 在软件开发中,多线程编程技术被广泛应用,相信多线程任务对我们来说已经不再陌生了.有了多线程技术,我们可以同做多个事情,而不是一个一个任务地进行.比如:前端和后台作交互.大任务(需要耗费一定的时间 ...

  10. LeetCode-2: Add Two Numbers

    [Problem:2-Add Two Numbers] You are given two non-empty linked lists representing two non-negative i ...