微博excel数据清洗(Java版)

微博数据清洗(Java版)

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

  • 2979

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

 

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

主要分为两部分:

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

2.处理excel读写操作。

上代码:

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


[java] view plain copy

  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 [email protected]
  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的的清洗。

[java] view plain copy

  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 [email protected]
  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. }

清洗后数据:

时间: 2024-10-10 02:24:57

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

微博URL短网址生成算法原理及(java版、php版实现实例)

短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更容易的分享链接. 例如:http://t.cn/SzjPjA 短网址服务,可能很多朋友都已经不再陌生,现在大部分微博.手机邮件提醒等地方已经有很多应用模式了,并占据了一定的市场.估计很多朋友现在也正在使用. 看过新浪的短连接服务,发现后面主要有6个字符串组成,于是第一个

Java版将EXCEL表数据导入到数据库中

1.采用第三方控件JXL实现 try { //实例化一个工作簿对象 Workbook workBook=Workbook.getWorkbook(new File("F://qzlx.xls")); //获取该工作表中的第一个工作表 Sheet sheet=workBook.getSheet(0); //获取该工作表的行数,以供下面循环使用 int rowSize=sheet.getRows(); for(int i=0;i<rowSize;i++) { //编号 String

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

原理: 新浪微博的URL都是如:http://weibo.com/2480531040/z8ElgBLeQ这样三部分. 第一部分(绿色部分)为新浪微博的域名,第二部分(红色部分)为博主Uid,第三部分(蓝色)为一串貌似随机的字符串. 如果通过方法能计算出蓝色字串与返回的数组里的对应关系则好解决多了. 首先分组蓝色字串 ,从后往前4个字符一组,得到以下三组字符:z8ElgBLeQ 将它们分别转换成62进制的数值则为 35, 2061702, 8999724  将它们组合起来就是一串 3520617

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

微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微信分享.扫一扫.卡券.支付等微信特有的能力,为微信用户提供更优质的网页体验. 本次的内容: 实现:分享到朋友圈,qq,qq空间,微信朋友的功能. 基础接口 判断当前客户端版本是否支持指定JS接口 wx.checkJsApi({ jsApiList: ['chooseImage'], // 需要检测的JS接

网易云音乐Java版爬虫

网易云音乐Java版爬虫 在编写爬虫之前,我们需要对网易云音乐网站网页类型进行分析,确认哪些页面是我们需要的,哪些页面是我们可以忽略的. 进入网易云音乐首页,浏览后发现其大概有这么几种类型的URL: 推荐页面 排行榜列表以及排行榜页面 歌单列表以及歌单页面 主播电台列表以及主播电台页面 歌手列表以及歌手页面 专辑列表(新碟上架)以及专辑页面 歌曲页面 最终需要爬取的数据在歌曲页面中,该页面里包含了歌曲的名称以及歌曲的评论数量. 另外,我们还需要尽可能多的获取歌曲页面,这些信息我们可以从前面6种类

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

Java版贪吃蛇(比较完善的版本)

很认真的写的一个java版的贪吃蛇游戏,图形界面,支持菜单操作,键盘监听,可加速,减速,统计得分,设定运动速度,设定游戏背景颜色等!应该没有Bug了,因为全被我修改没了.哈哈. 下面是项目各包及类的层次关系: 游戏的主要运行界面截图如下: 下面是部分代码,详细源码见此链接:http://pan.baidu.com/s/1bnubnzh //Snake类: package com.huowolf.entities; import java.awt.Color; import java.awt.Gr

java 操作 Excel,java导出excel

WritableWorkbook out = null; try { response.getServletResponse().reset(); ((HttpServletResponse) response.getServletResponse()).setHeader("Content-Disposition", "attachment;filename=export.xls"); response.getServletResponse().setConten

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪