sfit0144 (李四) 2015-01-10 18:00:25
1
Sfit0734 (Sfit0734) 2015-01-10 18:00:38
go home
sfit0144 (李四) 2015-01-10 18:09:52
下班
261340 (叶在宗) 2015-01-10 18:10:05
图片: {5F4C20B4-134F-4014-801D-8FFBA58587E9}.png
sfit0513 (蒋大有) 2015-01-10 18:43:55
下班
sfit0122 (雷一果) 2015-01-10 19:06:16
下班

将上面数据分析成下面格式,上面数据也是存在于文件当中,下面数据也是分析完后最后也放在文件当中

打卡日期    姓名      上班打卡             下班打卡             
2015-01-10  何科                           2015-01-10 19:46:05
2015-01-10  刘俊                           2015-01-10 20:39:00
2015-01-10  匡磊                           2015-01-10 19:43:52
2015-01-10  叶在宗                         2015-01-10 18:10:05
2015-01-10  李四      2015-01-10 18:00:25  2015-01-10 18:09:52
2015-01-10  蒋大有                         2015-01-10 18:43:55
2015-01-10  雷一果                         2015-01-10 19:06:16
2015-01-13  何科      2015-01-13 09:22:58  2015-01-13 19:01:07
2015-01-13  刘俊      2015-01-13 09:26:34  2015-01-13 19:28:37

下面是代码:

  1. public class MessageHistory {
  2.  
  3. Map<String, MessageSenderInfo> lines = new HashMap<String, MessageSenderInfo>();
  4. String outputPath;
  5. public static void main(String[] args) {
  6. MessageHistory messageHistory = new MessageHistory();
  7. messageHistory.multiReadMessage();
  8. messageHistory.outputCardRecordsToFile();
  9. }
  10.  
  11. public MessageHistory() {
  12. outputPath = System.getProperty("user.dir")+File.separator+formatDate(new Date()) + "—打卡记录.txt";
  13. File f = new File(outputPath);
  14. if(f.exists()){
  15. f.delete();
  16. }
  17. }
  18.  
  19. /**
  20. * 消息文件以work开头
  21. * 读取文件
  22. */
  23. public void multiReadMessage(){
  24. File dir = new File(System.getProperty("user.dir"));
  25. if(dir.getParentFile().exists()){
  26. for(File file:dir.listFiles()){
  27. if(file.getName().trim().matches("^work.*\\.txt$")){
  28. System.out.println("start read "+file.getAbsolutePath());
  29. readMessage(file.getAbsolutePath());
  30. }
  31. }
  32. }
  33. }
  34.  
  35. public void lineToMap(String line) {
  36. if (line.matches("^[A-Za-z0-9]{6}.*")) {
  37. int index = line.indexOf("(");
  38. int lastIndex = line.lastIndexOf(")");
  39. if (index > 0 && lastIndex > 0) {
  40. String workCode = line.substring(0, index);
  41. String name = line.substring(index + 1, lastIndex);
  42. String dateStr = line.substring(lastIndex + 1).trim();
  43. Date date = parseDate(dateStr);
  44. String key = formatDate(date) + "--" + workCode;
  45. MessageSenderInfo recoderBean = lines.get(key);
  46. if (recoderBean == null) {
  47. recoderBean = new MessageSenderInfo(workCode, name);
  48. recoderBean.setAtWorkTime(date);
  49. } else {
  50. if (recoderBean.getOffWorkTime() == null) {
  51. recoderBean.setOffWorkTime(date);
  52. }else{
  53. if(date.getTime() < recoderBean.getAtWorkTime().getTime()){
  54. recoderBean.setAtWorkTime(date);
  55. }else if(date.getTime() > recoderBean.getOffWorkTime().getTime()){
  56. recoderBean.setOffWorkTime(date);
  57. }
  58. }
  59.  
  60. }
  61. lines.put(key, recoderBean);
  62. }
  63. }
  64. }
  65.  
  66. public List<Map.Entry<String,MessageSenderInfo>> sortMessage(){
  67. List<Map.Entry<String,MessageSenderInfo>> list = new ArrayList<Map.Entry<String,MessageSenderInfo>>(lines.entrySet());
  68. Collections.sort(list, new MessageComparator());
  69. return list;
  70. }
  71. /**
  72. * 输出到文件
  73. */
  74. public void outputCardRecordsToFile() {
  75. printHeader();
  76. System.out.println("总记录:"+lines.size());
  77. List<Map.Entry<String,MessageSenderInfo>> list = sortMessage();
  78. for (Map.Entry<String, MessageSenderInfo> e : list) {
  79. MessageSenderInfo messageSenderInfo = e.getValue();
  80. String line = formatDate(messageSenderInfo.getAtWorkTime()) + " "+
  81. formatStringLen(messageSenderInfo.getName(),8) + " " ;
  82. if(messageSenderInfo.getOffWorkTime() == null){
  83. if(getHour(messageSenderInfo.getAtWorkTime()) >= 12){
  84. line += formatStringLen("",21);
  85. }
  86. line+=formatLongDate(messageSenderInfo.getAtWorkTime());
  87. }else
  88. if(messageSenderInfo.getOffWorkTime() != null){
  89. line += formatLongDate(messageSenderInfo.getAtWorkTime()) + " " ;
  90. line+=formatLongDate(messageSenderInfo.getOffWorkTime());
  91. }
  92. writeLine(outputPath, line);
  93. }
  94. }
  95. /**
  96. * 打印头部
  97. */
  98. public void printHeader(){
  99. String line = formatStringLen("打卡日期",12)+
  100. formatStringLen("姓名",10)+
  101. formatStringLen("上班打卡",21)+
  102. formatStringLen("下班打卡",21);
  103. writeLine(outputPath, line);
  104. }
  105.  
  106. /**
  107. * 格式化字符串长度
  108. * @param s
  109. * @param len
  110. * @return
  111. */
  112. public String formatStringLen(String s, int len) {
  113. if (len > s.getBytes().length) {
  114. StringBuilder sBuilder = new StringBuilder(s);
  115. for (int i = 0; i < len - s.getBytes().length; i++) {
  116. sBuilder.append(" ");
  117. }
  118. return sBuilder.toString();
  119. }
  120. return s;
  121. }
  122.  
  123. public void writeLine(String path, String s) {
  124. File f = new File(path);
  125. OutputStream os = null;
  126. try {
  127. os = new FileOutputStream(f, true);
  128. Writer wirte = new OutputStreamWriter(os, "UTF-8");
  129. BufferedWriter bufferedWriter = new BufferedWriter(wirte);
  130. bufferedWriter.write(s);
  131. bufferedWriter.newLine();
  132. bufferedWriter.flush();
  133. } catch (FileNotFoundException e) {
  134. // TODO Auto-generated catch block
  135. e.printStackTrace();
  136. } catch (IOException e) {
  137. // TODO Auto-generated catch block
  138. e.printStackTrace();
  139. } finally {
  140. if (os != null) {
  141. try {
  142. os.close();
  143. os = null;
  144. } catch (IOException e) {
  145. // TODO Auto-generated catch block
  146. e.printStackTrace();
  147. }
  148. }
  149. }
  150. }
  151.  
  152. public void readMessage(String path) {
  153. InputStream ins = null;
  154. BufferedReader buf = null;
  155. try {
  156. ins = new FileInputStream(path);
  157. buf = new BufferedReader(new InputStreamReader(ins, codeString(path)));
  158. String line = null;
  159. while ((line = buf.readLine()) != null) {
  160. lineToMap(line.trim());
  161. }
  162. } catch (FileNotFoundException e1) {
  163. // TODO Auto-generated catch block
  164. e1.printStackTrace();
  165. } catch (UnsupportedEncodingException e) {
  166. // TODO Auto-generated catch block
  167. e.printStackTrace();
  168. } catch (IOException e) {
  169. // TODO Auto-generated catch block
  170. e.printStackTrace();
  171. } finally {
  172. if (ins != null) {
  173. try {
  174. ins.close();
  175. } catch (IOException e) {
  176. // TODO Auto-generated catch block
  177. e.printStackTrace();
  178. }
  179. }
  180. }
  181. }
  182.  
  183. /**
  184. * 排序比较
  185. * @author sfit0734
  186. *
  187. */
  188. class MessageComparator implements Comparator<Map.Entry<String,MessageSenderInfo>> {
  189. @Override
  190. public int compare(Map.Entry<String,MessageSenderInfo> e1, Map.Entry<String,MessageSenderInfo> e2) {
  191. MessageSenderInfo m1 = e1.getValue();
  192. MessageSenderInfo m2 = e2.getValue();
  193. String dateStr = formatDate(m1.getAtWorkTime());
  194. String dateStr1 = formatDate(m2.getAtWorkTime());
  195.  
  196. int result = dateStr.compareTo(dateStr1);
  197. if(result != 0){
  198. return result;
  199. }else{
  200. return m1.getName().compareTo(m2.getName());
  201. }
  202. }
  203. };
  204.  
  205. public Date parseDate(String dataStr) {
  206. DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  207. //String dateString = formatter.format(currentTime);
  208. Date date = null;
  209. try {
  210. date = formatter.parse(dataStr);
  211. } catch (ParseException e) {
  212.  
  213. e.printStackTrace();
  214. }
  215. return date;
  216. }
  217.  
  218. public String formatDate(Date date) {
  219. DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
  220. String dateString = formatter.format(date);
  221.  
  222. return dateString;
  223. }
  224.  
  225. public String formatLongDate(Date date) {
  226. DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  227. String dateString = formatter.format(date);
  228.  
  229. return dateString;
  230. }
  231. /**
  232. * 获取小时
  233. * @param d
  234. * @return
  235. */
  236. public int getHour(Date d){
  237. Calendar cal=Calendar.getInstance();
  238. cal.setTime(d);
  239.  
  240. return cal.get(Calendar.HOUR_OF_DAY);
  241. }
  242.  
  243. /**
  244. * 判断文件的编码格式
  245. * @param fileName :file
  246. * @return 文件编码格式
  247. * @throws IOException
  248. * @throws Exception
  249. */
  250. public String codeString(String fileName) throws IOException {
  251. BufferedInputStream bin = new BufferedInputStream(
  252. new FileInputStream(fileName));
  253. int p = (bin.read() << 8) + bin.read();
  254. String code = null;
  255.  
  256. switch (p) {
  257. case 0xefbb:
  258. code = "UTF-8";
  259. break;
  260. case 0xfffe:
  261. code = "Unicode";
  262. break;
  263. case 0xfeff:
  264. code = "UTF-16BE";
  265. break;
  266. default:
  267. code = "GBK";
  268. }
  269.  
  270. return code;
  271. }
  272.  
  273. class MessageSenderInfo {
  274. String workCode;
  275. String name;
  276. Date atWorkTime;
  277. Date offWorkTime;
  278.  
  279. public MessageSenderInfo() {
  280. super();
  281. // TODO Auto-generated constructor stub
  282. }
  283.  
  284. public MessageSenderInfo(String workCode, String name) {
  285. super();
  286. this.workCode = workCode;
  287. this.name = name;
  288.  
  289. }
  290.  
  291. public String getWorkCode() {
  292. return workCode;
  293. }
  294.  
  295. public void setWorkCode(String workCode) {
  296. this.workCode = workCode;
  297. }
  298.  
  299. public String getName() {
  300. return name;
  301. }
  302.  
  303. public void setName(String name) {
  304. this.name = name;
  305. }
  306.  
  307. public Date getAtWorkTime() {
  308. return atWorkTime;
  309. }
  310.  
  311. public void setAtWorkTime(Date atWorkTime) {
  312. this.atWorkTime = atWorkTime;
  313. }
  314.  
  315. public Date getOffWorkTime() {
  316. return offWorkTime;
  317. }
  318.  
  319. public void setOffWorkTime(Date offWorkTime) {
  320. this.offWorkTime = offWorkTime;
  321. }
  322. }
  323. }

map数据的分组,list数据排序 数据筛选的更多相关文章

  1. [转]WPF and Silverlight 学习笔记(二十五):使用CollectionView实现对绑定数据的排序、筛选、分组

    在第二十三节,我们使用CollectionView实现了对于绑定数据的导航,除导航功能外,还可以通过CollectionView对数据进行类似于DataView的排序.筛选等功能. 一.数据的排序: ...

  2. 开始VS 2012中LightSwitch系列的第4部分:太多信息了!使用查询来排序和筛选数据

    [原文发表地址]  Beginning LightSwitch in VS 2012 Part 4: Too much information! Sorting and Filtering Data ...

  3. MySQL 对分组后的同类数据进行拼接字符串

    MySQL 对分组后的同类数据进行拼接字符串 写后台方法时遇到个问题,需要将表内同一订单号的操作记录流水进行简单拼接输出,不想取出来再操作,找了个mysql的方法直接操作 //group_concat ...

  4. oracle 根据字段分组取第一条数据及rank函数说明

    当前有这样一个需求,根据外键对子表数据进行分组,取每组中的一条数据就行了,如图: 如:COMMANDID = 26的有两条,只取一条数据. sql语句: select * from(select SY ...

  5. mybatis从数据库中取数据且分组,返回分组数据

    mapper.xml文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PU ...

  6. Java将数据进行分组处理

    将传人的数据进行分组,使用map保存每组的数据. /** * 将取出的数据进行分组 * @param list * @return */ public Map<Integer,Object> ...

  7. 用 Python 排序数据的多种方法

    用 Python 排序数据的多种方法 目录 [Python HOWTOs系列]排序 Python 列表有内置就地排序的方法 list.sort(),此外还有一个内置的 sorted() 函数将一个可迭 ...

  8. mysql 查询数据时按照A-Z顺序排序返回结果集

    mysql 查询数据时按照A-Z顺序排序返回结果集 $sql = "SELECT * , ELT( INTERVAL( CONV( HEX( left( name, 1 ) ) , 16, ...

  9. MFC listcontrol 分列 添加行数据 点击列头排序

    适用于 对话框程序 1.在工具箱中拖出 ListControl,然后右键-属性,view-Report 让你的ListControl变成这幅模样! 2.添加ListControl控件的control类 ...

  10. IOS第七天(3:UiTableView 模型和数据的分组的显示)

    *************UiTableView模型和数据的分组的显示 #import "HMViewController.h" #import "HMHero.h&qu ...

随机推荐

  1. 【霍夫曼树】 poj 1521 Entropy

    poj.org/problem?id=1521 注意只有特殊情况:只有一种字母 #include<iostream> #include<cstdio> #include< ...

  2. 多线程-java并发编程实战笔记

    线程安全性 编写线程安全的代码实质上就是管理对状态的访问,而且通常都是共享的,可变的状态. 一个对象的状态就是他的数据,存储在状态变量中,比如实例域或静态域.所谓共享是指一个对象可以被多个线程访问:所 ...

  3. 创建mavenweb项目

    1.创建maven项目 2.创建maven-web项目 3.将webapp文件夹复制到maven项目下,src路径下

  4. Gty的妹子树(bzoj 3720)

    Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕…… Gty神(xian)犇(chong)从来不缺妹子…… 他来到了一棵妹子树下,发现每 ...

  5. PatentTips - Write Combining Buffer for Sequentially Addressed Partial Line Operations

    SUMMARY OF THE INVENTION The present invention pertains to a write combining buffer for use in a mic ...

  6. JS基础之BOM对象

    BOM 对象 JavaScript分为 ECMAScript,DOM,BOM. BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作.使用 BOM,开发者可以移动窗口.改变状态栏中的文本以及执行其 ...

  7. HUNAN 11562 The Triangle Division of the Convex Polygon(大卡特兰数)

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11562&courseid=0 求n边形分解成三角形的 ...

  8. 利用背景流量数据(contexual flow data) 识别TLS加密恶意流量

    识别出加密流量中潜藏的安全威胁具有很大挑战,现已存在一些检测方法利用数据流的元数据来进行检测,包括包长度和到达间隔时间等.来自思科的研究人员扩展现有的检测方法提出一种新的思路(称之为“dataomni ...

  9. Netty3 源代码分析 - NIO server绑定过程分析

    Netty3 源代码分析 - NIO server绑定过程分析      一个框架封装的越好,越利于我们高速的coding.可是却掩盖了非常多的细节和原理.可是源代码可以揭示一切. 服务器端代码在指定 ...

  10. 改动Xmodem/Zmodem上传下载路径

    SecureCRT能够使用Xmodem/Zmodem方便的上传和下载文件. 在Session ptions =>Xmodem/Zmodem => Directories中设置   选项=& ...