奇葩的报表(连更-对,昨天发生大事了。。。。)
- 背景:
- A、B2个IDC,A地全为windows服务器(游戏业务);B地为linux(数据统计、充值、站点业务)
- A地每个区服每天运行会产生很多日志,为玩家账号数据变动信息(装备更新、角色属性等)
- 需要将A地日志拉倒B地进行报表输出后给运营团队分析
- 奇葩点:
- 游戏业务团队只提供FTP(真TM安全),余事不管
- 日志为GBK,OS、DB、APP处理的都是utf8,so不能通过shell来处理,且不同名称日志导入不同表中...
- 时间紧急,早上的需求下午就要看报表(想什么来什么.....)
- 思路:
- 用python(写的是脚本,连对象都不要),先不管性能,先实现功能后后续优化
- 姿势上码:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # author: qiaogy 4 5 from ftplib import FTP 6 import os 7 import sys 8 import shutil 9 import subprocess 10 import zipfile 11 12 13 root = os.path.dirname(os.path.abspath(__file__)) 14 sys.path.append(root) 15 16 dest_dir = [] # 要处理的日志目录 17 table_dic = { 18 '01': 'gamereport.tb_game_detail_info_30012_1_01"', 19 '02': 'gamereport.tb_game_detail_info_30012_1_02"', 20 '03': 'gamereport.tb_game_detail_info_30012_1_03"', 21 '04': 'gamereport.tb_game_detail_info_30012_1_04"', 22 '05': 'gamereport.tb_game_detail_info_30012_1_05"', 23 '06': 'gamereport.tb_game_detail_info_30012_1_06"', 24 '07': 'gamereport.tb_game_detail_info_30012_1_07"', 25 '08': 'gamereport.tb_game_detail_info_30012_1_08"', 26 '09': 'gamereport.tb_game_detail_info_30012_1_09"', 27 '10': 'gamereport.tb_game_detail_info_30012_1_10"', 28 '11': 'gamereport.tb_game_detail_info_30012_1_11"', 29 '12': 'gamereport.tb_game_detail_info_30012_1_12"', 30 } 31 32 33 # 登陆 34 ftp = FTP('x.x.x.x') 35 ftp.login('qiaogy', 'x.x.x.x') 36 ftp.cwd('/chuanqi/lxtx1qu') 37 38 # 创建 zip 归档下载目录 39 zip_dir = os.path.join(root, 'zip_dir') 40 if not os.path.exists(zip_dir): 41 os.mkdir(zip_dir) 42 43 44 # 求差集,避免下载已经处理过得zip包 45 already_zip = os.listdir(zip_dir) 46 des_zip_dir = ftp.nlst() 47 for item in already_zip: 48 if item in des_zip_dir: 49 des_zip_dir.remove(item) 50 51 # 从ftp下载 zip文件,放入 zip_dir 52 for file in des_zip_dir: 53 if file.endswith('.zip'): 54 dest_file = os.path.join(zip_dir, file) 55 ftp.retrbinary('RETR {}'.format(file), open(dest_file, 'wb').write) 56 print('download cucess:{} '.format(file).center(50, '=')) 57 # 从zip_dir 解压至根目录下 58 z = zipfile.ZipFile(dest_file, 'r') 59 z.extractall(path=root) 60 61 62 63 64 65 # 找到指定目录['2016-08-30', '2016-08-31'], 只要是以指定格式开头的都算 66 for file in os.listdir(root): 67 if file.startswith('2016'): 68 dest_dir.append(file) # 以2016开头的所有文件 69 70 71 # 创建转码后的目录 utf8/utf8.2016-08-30 72 for dir_name in dest_dir: 73 utf8_root = os.path.join(root, 'utf8') 74 utf8_dir = os.path.join(utf8_root, 'utf8.' + dir_name) 75 if os.path.exists(utf8_root): 76 if not os.path.exists(utf8_dir): 77 os.mkdir(utf8_dir) 78 else: 79 print(utf8_dir, 'already exsit') 80 else: 81 os.mkdir(utf8_root) 82 os.mkdir(utf8_dir) 83 84 85 86 # 转码后保存至 utf8/utf8.2016-08-30/filename-utf8 87 for dir_name in dest_dir: 88 print('begin to update DB ,dir is {}'.format(dir_name).center(50, '=')) 89 dir_abs = os.path.join(root, dir_name) 90 for file in os.listdir(dir_abs): 91 logfile_abs = os.path.join(dir_abs, file) 92 utf8_file = os.path.join(root, utf8_dir, file+'-utf8') 93 if os.path.exists(utf8_file): 94 print('utf8 file already exists') 95 continue 96 with open(logfile_abs, 'r', encoding='GBK') as f1, open(utf8_file, 'w', encoding='utf-8') as f2: 97 for line in f1: 98 f2.write(line) 99 100 # 开始导入数据 101 sql_file = '\'' + utf8_file + '\'' 102 table = table_dic.get(dest_dir[0][5:7]) 103 sql_cmd = 'mysql -h127.0.0.1 --local-infile -uroot -p\'redhat123\' -e "load data local infile '\ 104 + sql_file + ' into table ' + table 105 obj = subprocess.Popen(sql_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 106 stdout_data, stderro_data = obj.communicate() 107 108 if len(stdout_data) == 0: 109 print('sql load data ok, file:{}'.format(utf8_file)) 110 else: 111 print('sql load error, file:{}'.format(utf8_file)) 112 113 else: 114 print('sql update cuccess:{}'.format(dir_name).center(50, '=')) 115 116 # 清除解压后的目录 117 118 for name in dest_dir: 119 shutil.rmtree(name) 120 print('{} dir cleand'.format(name).center(50, '='))
转载于:https://www.cnblogs.com/qiaogy/p/5841514.html
奇葩的报表(连更-对,昨天发生大事了。。。。)相关推荐
- 哪款报表工具更适合行业软件开发商?
行业软件开发商(以下简称开发商)是我国最常见的软件公司了,其本身具备较强的技术能力,而且每年都会承接很多项目,在选择报表工具时的关注点与技术能力不强(大部分).且在较长时间内只选购一次产品的行业终端用 ...
- 又见奇葩乘客!醉酒男子与人发生冲突迫使飞机返航
中新网1月22日电 据澳大利亚新快网报道,当地时间21日,一个从澳大利亚昆士兰州飞往新加坡的航班在起飞仅1小时20分钟后,有一名醉酒男乘客与机上其他乘客发生冲突,导致该航班被迫返回,随后男子被交由警方 ...
- FineReport 11.0 五大全新功能,让报表开发更快、更好看
在FineReport 11.0 剧透中,大师兄给大家预告了很多亮点功能!布局推荐.复用组件.主题切换等功能对应的痛点场景更是引起了超多的共鸣! 这些让我们困扰已久的问题,在 FineReport 1 ...
- 导出excel 数据取一次合理还是分页取合理_一张报表模板替代数百张Excel表格,用它让报表工作更轻松...
要问现代职场人,必备工作技能是什么?Excel技能当仁不让,数据分析.总结汇报.信息传达,统统离不开.但是在日常工作中,Excel也有着它的局限性,以月度数据汇报为例,每月都需重新做表统计,其实内容还 ...
- 关于昨天发生的卫星逼近空间站的事情
昨天看到消息说两颗美国卫星逼近了中国空间站,我空间站被迫进行了避让,当时还不知道这就是星链计划的卫星之一,今天看到了确切消息,我有了下面的话. 特别想由衷的说一句话,有些马吹就不要再吹了,什么人类之星 ...
- PPT丑哭了?这个工具做报表上手更简单,效果更酷炫,送40套模板
如果2023年你还做着万年不变的饼图.折线图,你将会再次错失涨薪的机会! 数据有多重要,已经不言而喻,随之而来的是职场对数据分析与展示能力的要求也越来越高. 但是你是不是这种情况?一用图表就只会用饼图 ...
- 报表控件ActiveReports设计器,让报表开发更简单
ActiveReports是一款专注于 .NET 和 .NET Core 平台的报表控件.通过拖拽式报表设计器,可以快速地设计 Excel表格.Word文档.图表.数据过滤.数据钻取.精准套打等类型报 ...
- 数据可视化demo_为更快读懂报表,我们将数据可视化了
将数据可视化后,即使是复杂难懂的数据也会瞬间变得简单易懂,难就难在怎么快速将海量数据中的复杂数据信息提取,不同场景下该用那种方式展示数据更直观易懂.而这些,在奥威BI数据可视化软件上都有了答案. 在常 ...
- 用BI报表来做预算,更有说服力
下一年的预算能不能顺利批下来,能不能确保重要的几个项目预算不被砍?那就得将预算分析做得直观易懂,将投入和回报分析做得更细致,让管理决策者看到该预算的合理性.必要性.如何才能让预算分析报表更简单明了,让 ...
最新文章
- R语言进行dataframe数据左连接(Left join):使用R原生方法、data.table、dplyr等方案
- 【学习笔记】redis一些配置文件参数详解
- Acwing 252. 树 点分治
- [导入]写了个img2ppt的demo,为写PDF2PPT做准备
- BigNums 之 hdu 1753
- 面试官:谈谈 Tomcat 架构及启动过程,我一脸懵逼。。
- 丹纳赫:全球实业型赋能投资标杆
- 历史 微信开发者工具_微信开发者工具-微信开发者工具下载 v1.03.2011120官方版--pc6下载站...
- 163 镜像源 linux,网易163的Ubuntu apt镜像源
- CMOS与TTL(下)
- 使用计算机VLOOKUP函数需注意什么,lookup和vlookup的区别 计算机Excel中的lo...
- 华硕台式计算机光盘怎么启动不了,华硕台式机U盘启动不了怎么回事
- 凹点匹配 matlab源码,粘连类圆形目标图像的分割方法与流程
- 深刻理解:无人机数据系统应用
- 【句库】英语论文写作之好词好句积累
- 安卓手机云控系统框架源码,PHP+Autojs, ,这套是空框架源码
- 全网最全AD16——原理图绘制
- 什么是手机号码姓名实名认证 手机号码查姓名 手机号实名认证API
- 深入浅出内存马(一)
- 计算机软件研究方法与技术路线,开题报告研究方法与技术路线.doc
热门文章
- .NET分布式缓存Memcached测试体验
- WebUI中DataGrid多层表头的终极解决办法
- python代码优化_Python 代码优化技巧(一)
- mysql与ms sql server_MS SQL Server和MySQL区别
- html中怎么实现广告自动出来又自动隐藏?,基于jquery实现的定时显示与隐藏div广告的实现代码...
- linux 重新分区挂载,Linux:挂载磁盘分区,linux已挂载磁盘重新分区
- 8086 c语言,2016年上海大学机电工程与自动化学院微机硬件及软件(包含8086微机和C语言)之C程序设计考研复试题库...
- 要了薪资证明了录取的几率大吗_空乘专业的录取分数线是多少?
- C++编程进阶1(对于单纯的常量,用const替换#define、operator[]与const)
- 插值算法C实现(一元全区间)