当前课程知识点:程序设计基础 > 第七章 文本数据处理 > 程设论道 > 程设论道
我们这节课讲到的是文本数据的处理
那其实我这节课一上来
就给了大家一个已经生成好了的一个日志文件
然后就按照这个一步一步往下处理
但是其实如果大家在这个真正的生活当中
遇到这种有日志文件这种情况
还得自己去看一看这个文件到底是长什么样子
对 主要是要去看看这个文件是什么格式的
我们要根据不同的格式才知道
应该怎么去读那个文件 怎么去处理这些数据
格式其实是一个很重要的概念
我觉得就是同学们可能在这一章里头
接触到这个日志文件的处理
可能是第一次接触这种数据的存放的格式
所以实际上不同的数据
它的格式有可能规定得不一样
对吧 像你的日志里头 你可能第一列是什么
第二列是什么 第三列是什么
那别人写的可能不是那样子的
所以你得根据别人写的数据
的本身的这种情形去看
它的文档什么之类的 它到底怎么来规定的
然后才能够根据相应的格式
去处理正确的这种处理数据
像我接手过有的公司里
就专门有一个公司做这样的事情
就是他把不同公司采集到的
比如说路上一些的这些街道的信息
然后他想整合一下
做成一个类似于大地图的这样一个数据
然后结果不同的公司来的数据格式就不一样
然后就得花很大的时间去
把不同格式的东西读出来
然后在用一个统一的格式
得用不同的程序去读不同的格式是吧
所以他们那些公司的一线人员
跟人交流的时候最多的话就是 在干嘛
我在改这个格式转化
把这种格式转化成另一种格式
实际上他没有产生新的数据
但他只是把数据的样子给改了
但是这个样子其实很关键
因为你呈现出的样子不同的时候
也就是你的格式不一样的时候
直接会带来计算机它处理的这种
效率啊或者算法上的变化
所以有的时候我们可能还要推敲一下
根据一个具体的数据
我们可能某种格式处理起来就比较方便
特别是我们文本处理的时候
至少我们平时看到的
像这个就是举得例子里头的
这些日志的格式 然后要Windows系统里
有一些这种配置文件格式啊
根据不同的需要 它其实格式就不一样
这样保证你用的时候某种方便
当然有的时候程序处理也是方便的
所以其实包括你那个日志文件
给出来说 因为日志文件肯定是
另外一个人写程序生成出来的
那他生成的时候就得注意
就是你后来可能还有其他程序要去读取它
所以他就得想着说 我前面比如先输出时间
或者在先输出什么 然后中间用个分隔符
把它隔开 这样的话为什么要用分隔符呢
就是因为后面程序处理它更方便
没有分隔符的话我就不知道
这个我的时间到哪算是个结束啊
我这读的程序就很困难 就很麻烦
其实我们平时很多地方交流
都是说如果有个好的格式
你要遵循格式这样去呈现你的数据的话
别人处理就比较方便
所以我们说 我们写代码
我们推荐比较好的代码风格
其实就是为了让人读的时候
能够很容易的去理解
因为编译器其实读的时候
你有的格式不好没关系
它处理能力比较强 但人读就困难
实际上就是说 我们自己写的这个程序
就我们说文本文件 就是能够打开
然后人还能看懂的
其实你那个程序也是能打开 能看懂的东西
然后会有一个程序来处理它
这个程序就是咱们说的那个编译器
所以虽然说编译器
它其实呢待会我们会讲
它实际上是另外一个问题
去读这个数据
但是我们呈现在屏幕上的时候
这个代码刚才邬老师说的
有这种比如说缩进啊
我们也提了一些推荐风格的
这种要求其实就是因为人这个视觉系统
就是人的这个视觉和信息这种处理的
它这个计算这种特殊的计算机吧
它对格式的理解其实它跟计算机不太一样
它对于这种 比如说对齐不对齐
然后有没有空行 它是非常敏感的
所以这样的话 你按照这样来
人一眼扫过去 那真的就一目十行
立马把你的代码结构啊什么的都清楚了
那跟这种类似的 刚才是说视觉
其实呢听觉系统也是这样的
你看我们讲话 你如果是声音
一个音调过去 没有抑扬顿挫 没有变化
那人有的时候根本就听不出来
或者说不太容易听出来
你讲话的重点是什么
有些机器人研究
机器人说的英文都是一条线下来的
所以它那就叫做格式不好
还是这信息 但是它编排方式上面
没有达到让人更便于去理解和交流的目的
那有的人断句子断的不准
出现这种错误或者是一些笑话
其实也是在于它对于用声音去控制
用你的这种各种变化去控制
声音的格式 掌握的不好
包括说我们写文字 标点符号没打错
其实也是格式有错误
那你就会传达错误的这种信息
那我们现在讲计算机其实
也是一个类似的道理
你这些数据也得有格式
你格式选的不好会有问题
格式选错了那问题更大了
所以像您刚才说的就是这个格式
存在的意义是因为我这个
数据是要跟别人做沟通的
做交流的时候有一个格式
于是就产生了各种各样不同的格式
格式也很多 然后我们就还得去沟通一下
我们的格式是什么样的 所以要写文档啊
然后一旦我们需要去沟通格式的时候
那就格式变成了一个数据
我们沟通内容本身就是格式
那你还要找到更好地格式
把这个数据的一个表达清楚
格式的一个格式
所以有时候我有时候问别人说
比如打扑克牌的游戏 介绍一个新的
我有时候总感觉呢就是
你学过计算机的人
能够把这个游戏怎么玩讲的很清楚
因为它是按照你人怎么去理解
或者怎么去运作这个游戏
然后一步步去讲 那么这样一种格式
就便于人们去理解
这个信息他就用的比较准
那反过来如果说他不照着这个去说
就是不是按照这样的一个
就是大家理解或者去玩这个游戏的一个
步骤 不按照这个规范去说
那个游戏的规则的话
那你对这个规则的理解就会产生偏差
所以换言之
你怎么去把格式这种数据给别人去交流
恐怕不只是简单的写几个字就完了
你得想想你怎么去写它
这就所谓的你也得讲章法
讲规则去讲你的这个格式是什么
没有个套路
这个关于格式的这种阐述的套路
或者说规定
其实就是说你们刚才提到的格式的格式
这种例子其实计算机里头也很多
特别是说计算机这样一个
我们说比如说编译器的吧
我们有的计算器程序相当于是
能够处理不同的语言
那它可以去配置不同的
语言的语法这种格式
所以我们就有些这种我们说
所谓的也是专门用来表示
这种格式 表示语法的语言
一些工具 叫什么BNF
还有那个yake
那可能是将来他们高年级会学到的
编译员里反正就会用到这样的工具程序
其实包括我们现在每个同学上网的时候
它有时候那个网页出错了会给出那个源码
那个源码其实有的时候你能看出来
它叫做什么XML
这样的话其实这个其实也是一个关于
你怎么去组织数据的
那个格式的一种说明的标准
XML它国际上有标准嘛
那个标准其实就相当于对那个格式的
一种格式化的规定 你必须这么写
然后那个格式本身呢又可以用来
相当于你写出来的这种格式
可以用来在计算机之间相互交流数据
只要遵照相应的东西
你就可以从数据里头先知道
它会是什么格式
然后再让这个格式去读这个最底层的数据
其实我们那个C C++里头 就是输入输出
当然我们这门课里头主要讲的就是
cin cout
但是有些同学其实大家的网上交流
用的是scanf printf
它那里头就可以说定义这个
输入输出的格式 专门的规范
规定了一个我要按照一个什么样的格式
来输出 %S %D
所以我们以前有的那个练习
大家也能看得到比方说
让它打印一个日历 这你得规定好吧
我这个一排排星期几
星期一对企业有多少个空格
对不对 然后每一个日子占多少格
然后这一个月打完了打下一个月
怎么打 每个月的表头怎么打
这其实都是关于
这个日子 日历本身底层的信息
怎么组织的一种格式 而这个格式呢
如果我们去用不管是cout也好
cout其实也可以控制对吧
如果是用刚才你说的printf的话
那他就得好好推敲它里头那个双引号
里头那个参数怎么去写
%2D那它可能就是两个
最多两个位数的宽度的整数
而且他就把它怎么输出的格式
給它做成控制
控制这个的那个%的那个东西
其实就相当于格式的格式
这个其实也很关键 规定好这些格式嘛
然后我们后面才好对这个数据
做进一步的处理
然后一旦做这个处理嘛
其实我们这节课讲的
就是其实我们是想抓到这些数据
这些数据很多 我一条条读起来很麻烦
我想抓到一些规律性的一些统计性的数据
告诉我给我一些指导性的意见
一般我们也就拿到了这么几个数
然后我就知道我下面该做什么
实际上有的时候我们看到了很多数据
但那个时候呢我们如果想要
自动处理很好处理呢
我们还要主动去发现一些规律
或者说格式 然后掌握格式之后我们再来
去处理这些数据的时候
就能够很快很方便的就去处理
所以有时候我们编程序呀
其实也不是一开始就把
这个程序的所有的结构
或者各种东西都想好啦
有的时候这个数据来了之后
就像邬老师讲的可能
还有一个对数据本身的一种分析
从里头把握一些规律
比如就像你刚才那个日志里头
日志可能有成千上万条
那用户可能只有五百个
对吧 那这个时候
如果掌握到说它确实
只有500个这样的信息的话
像这个从数据里头发现了这样的一种规律
那我在设计什么样的数据结构
来存储这个数据
用什么样的办法来处理它就会有讲究了
所以呢从数据里头找到规律
或者找到格式的信息 就它怎么编排的
其实不光是为了这个数据的交流
它也是为了 反过来也能够运用于
我们怎么来把这个数据更好地处理
发现更多的规律呢
能够反过来简化我们处理的这个程序
然后能够給它一些规律
我总结一下实际上是有两层意思
第一层就是说 可能数据本身的这个
比如说位置顺序啊这是一个规律
另外呢就是数据统计 或者更深层次的
某种层次上的它有另一种规律
那我们这个位置这种规律
我们可能是一个浅层的规律呢
我们很好地读进来处理
但是如果有更深层的规律发现的话
比如说我们比如选择数据结构啊
选择不同算法
它就也有了一个依据指导我们更好地去处理
其实除了反过来指导我们处理程序之外呢
其实还有更多的针对实际
生活工作当中的一些应用
就相当于你从数据里头得到了规律了呗
这规律本身就知识嘛 知识从哪来的
对吧 你见多识广 识是什么
你就是从众多的数据众多的信息里头得到了
哦原来这个事情是这样子的
对吧 这个时候知识或者说规律
就变成了你的知识 变成了一种技能
那所以你去安排一些事情
或者处理一些事情的时候可能就会不一样
前面那个返回去改代码
只是其中的一种应用的形式
那还可以用到别的地方去
所以我们有一个研究叫做“数据挖掘”
通过大量的数据里头去
发现一些新规律 发现一些新知识
然后是为了能够更好地去应用
这样的知识规律
比如说拿我们这节课的日志
其实同学们有兴趣的
可以自己去做一个练习 分析一下
我在一天当中什么时间段
到底有多少人正在听课
然后这样呢能有什么用呢
可能就mooc系统在做这个
服务器分配的时候发现
中午听的人比较多 大家都在吃饭
那我中午分配服务器就多一点
然后大半夜的两三点钟基本没有人听
那我就可以关掉一些机器
这样也节约能源嘛
对这样我们生活中其实用的特别多
就比如说统计这个公交的乘坐的人数
那我就知道说哪个时候是上下班的高峰
就我们就可以提供
对我们就建议大家比如说错峰上下班啊对吧
而且我们中国人啊耳熟能详的
你看到了春节的时候 加开临客
为什么平时不加开呀 对不对
它事先有一个预算 我大概有多少人会流动
你原来的不行 我就给加上去
它其实也从过去历往历届的这种
售票的信息里头知道说
有多少这样的一个需求
我就临时去安排他
这个其实也是从数据里头得到的
规律的另外一种很好地运用
-1.1 基础知识
-1.2 买菜问题
-1.3 数学运算
-1.4 补充说明
-1.5 总结
--1.5 总结
-程设论道
--程设论道
-师生问答
-第一章 编程初步--语法自测
-2.1 关于超级计算器的几点思考
-2.2 电子秤模拟 — 背景介绍及需求分析
-2.3 电子秤模拟 — 代码实现
-2.4 变量定义与变量类型
-2.5 猜数游戏与数据表示
-2.6 关于变量的讨论
--公告
-2.7 变量体现的计算思维
-程设论道
--程设论道
-师生问答
--师生问答
-第二章 变量与代数思维--语法自测
-3.1 谁做的好事——语义表示
-3.2 谁做的好事——真假检查
-3.3 谁做的好事——循环枚举
-3.4 谁是嫌疑犯——多重循环枚举
-3.5 谁是嫌疑犯——破案线索表示
-3.6 谁是嫌疑犯——用二进制枚举
-程设论道
--程设论道一
--程设论道二
--程设论道三
-师生问答
-第三章 逻辑推理与枚举解题--语法自测
-4.1 插花游戏
-4.2 筛法
-4.3 线性查找
-4.4 折半查找
--4.4.1 提问
-4.5 排序问题
-4.6 总结
--4.6.1 总结
-程设论道
--程设论道二:筛法
-师生问答
-第四章 筛法与查找--语法自测
-5.1 阶乘
-5.2 排序
-5.3 矩阵填充
-5.4 分书与八皇后
-5.5 青蛙过河
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答一
--师生问答二
-第五章 分治思想与递归--语法自测
-6.1 兔子数列问题
-6.2 分鱼问题
-6.3 橱窗的插花问题
-6.4 最长公共子序列问题
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第六章 递推与动态规划--语法自测
-7.1 统计记录总数
-7.2 统计活跃用户数
-7.3 统计在线时长
--7.3.2 结构
-7.4 总结
--7.4.1 总结
-程设论道
--程设论道
-师生问答
--师生问答
-第七章 文本数据处理--语法自测
-8.1 将数据组织成链表
-8.2 提高链表访问效率 —— 哈希链表
-8.3 以二进制文件存储链表
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第八章 非文本数据处理--语法自测
-9.1 自动售卖程序
-9.2 配制水果信息
-9.3 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测