免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5170 | 回复: 3
打印 上一主题 下一主题

[文本处理] 时间日期 好 乱 啊 [复制链接]

论坛徽章:
8
2016科比退役纪念章
日期:2018-10-24 08:24:0115-16赛季CBA联赛之北控
日期:2019-03-12 14:34:562016科比退役纪念章
日期:2019-04-01 10:33:0915-16赛季CBA联赛之山东
日期:2019-04-17 12:46:3215-16赛季CBA联赛之广夏
日期:2019-05-09 16:40:4015-16赛季CBA联赛之广夏
日期:2019-10-10 15:33:4015-16赛季CBA联赛之辽宁
日期:2019-10-15 08:37:0615-16赛季CBA联赛之北控
日期:2021-03-30 15:53:34
1 [报告]
发表于 2019-10-10 09:50 |显示全部楼层
二楼的  date 转换后再排序 是一个办法,我也测试了。但发现有两个问题,第一个速度比较慢,楼主的示例文件在我的电脑上跑出结果大概需要15秒。第二个,排序的结果不是稳定的,即如果两个时间值相同时,和原始次序不太一样。
我一开始想用sort 对原来的字符串 直接排序,月份的排序是关键, sort --help 一看它有-M 选项 支持月份排序,但在我的电脑上试了 -M 选项不起作用的,不知是只支持JAN 这种三字符的月份还是其它的原因。
后来想想还是上Python**,且python的sort是稳定的排序。

仅供参考,示例文件跑完大概在0.3秒,大文件未测试,不知会如何。
  1. #!/usr/bin/python3

  2. from enum import Enum

  3. class Month(Enum):
  4.     (January,February,March,April,May,June,
  5.         July,August,September,October,November,December) = range(1,13)

  6. with open("1.txt","r",encoding="utf-8") as f:
  7.     s = (line.split() for line in f)
  8.     res = sorted(s,key=lambda line: (line[3],Month[line[1]].value,line[2],line[0])) #按 年,月,日,时间 排序
  9. with open("sorted.txt","w",encoding="utf-8") as fw:
  10.     for line in res:
  11.         fw.writelines("{}\n".format(" ".join(line)))
复制代码

论坛徽章:
8
2016科比退役纪念章
日期:2018-10-24 08:24:0115-16赛季CBA联赛之北控
日期:2019-03-12 14:34:562016科比退役纪念章
日期:2019-04-01 10:33:0915-16赛季CBA联赛之山东
日期:2019-04-17 12:46:3215-16赛季CBA联赛之广夏
日期:2019-05-09 16:40:4015-16赛季CBA联赛之广夏
日期:2019-10-10 15:33:4015-16赛季CBA联赛之辽宁
日期:2019-10-15 08:37:0615-16赛季CBA联赛之北控
日期:2021-03-30 15:53:34
2 [报告]
发表于 2019-10-10 15:28 |显示全部楼层
回复 11# aaaa_123
python2肯定也行的,2写的不熟,基本学的时候就用3了
改了一下,也可以跑。
  1. #!/usr/bin/python

  2. Month={
  3.     "January":1,
  4.     "February":2,
  5.     "March":3,
  6.     "April":4,
  7.     "May":5,
  8.     "June":6,
  9.     "July":7,
  10.     "August":8,
  11.     "September":9,
  12.     "October":10,
  13.     "November":11,
  14.     "December":12
  15.     }
  16. with open("1.txt","r") as f:
  17.     s = (line.split() for line in f)
  18.     res = sorted(s,key=lambda line: (line[3],Month[line[1]],line[2],line[0]))
  19. with open("sorted.txt","w") as fw:
  20.     for line in res:
  21.         fw.writelines("{}\n".format(" ".join(line)))
复制代码




论坛徽章:
8
2016科比退役纪念章
日期:2018-10-24 08:24:0115-16赛季CBA联赛之北控
日期:2019-03-12 14:34:562016科比退役纪念章
日期:2019-04-01 10:33:0915-16赛季CBA联赛之山东
日期:2019-04-17 12:46:3215-16赛季CBA联赛之广夏
日期:2019-05-09 16:40:4015-16赛季CBA联赛之广夏
日期:2019-10-10 15:33:4015-16赛季CBA联赛之辽宁
日期:2019-10-15 08:37:0615-16赛季CBA联赛之北控
日期:2021-03-30 15:53:34
3 [报告]
发表于 2019-10-11 08:11 |显示全部楼层
一开始我就想用15楼的sort的方法,不过我自己环境试了 -M的选项没起作用 ,排序的结果是错的。所以我后来才用python写。

论坛徽章:
8
2016科比退役纪念章
日期:2018-10-24 08:24:0115-16赛季CBA联赛之北控
日期:2019-03-12 14:34:562016科比退役纪念章
日期:2019-04-01 10:33:0915-16赛季CBA联赛之山东
日期:2019-04-17 12:46:3215-16赛季CBA联赛之广夏
日期:2019-05-09 16:40:4015-16赛季CBA联赛之广夏
日期:2019-10-10 15:33:4015-16赛季CBA联赛之辽宁
日期:2019-10-15 08:37:0615-16赛季CBA联赛之北控
日期:2021-03-30 15:53:34
4 [报告]
发表于 2019-10-12 08:10 |显示全部楼层
要自定义字符的顺序,我前面写的python可以的,前面的Month实际就是自定义了一个顺序,类似你再自己定义一个即可。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP