- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个以下 csv 文件(每行都是动态字符数,但列是固定的......希望我说得通)
**001** Math **02/20/2013** A
**001** Literature **03/02/2013** B
**002** Biology **01/01/2013** A
**003** Biology **04/08/2013** A
**001** Biology **05/01/2013** B
**002** Math **03/10/2013** C
我正在尝试将结果按以下格式获取到另一个 csv 文件中,其中按学生 ID 分组并按日期升序排列。
001,#Math;A;02/20/2013#Biology;B;05/01/2013#Literature;B;03/02/2013
002,#Biology;A;01/01/2013#Math;C;03/10/2013
003,#Biology;A;04/08/2013
不过有一个限制。 输入文件很大,大约有 2 亿行。我尝试使用 C# 并将其存储在数据库中并编写 SQL 查询。它非常慢并且不被接受。经过谷歌搜索后,我听说 python 对于这些操作非常强大。我是 Python 新手,开始玩代码。我真的很感谢 PYTHON 专家帮助我得到上面提到的结果。
最佳答案
content='''
**001** Math **02/20/2013** A
**001** Literature **03/02/2013** B
**002** Biology **01/01/2013** A
**003** Biology **04/08/2013** A
**001** Biology **05/01/2013** B
**002** Math **03/10/2013** C
'''
from collections import defaultdict
lines = content.split("\n")
items_iter = (line.split() for line in lines if line.strip())
aggregated = defaultdict(list)
for items in items_iter:
stud, class_, date, grade = (t.strip('*') for t in items)
aggregated[stud].append((class_, grade, date))
for stud, data in aggregated.iteritems():
full_grades = [';'.join(items) for items in data]
print '{},#{}'.format(stud, '#'.join(full_grades))
输出:
003,#Biology;A;04/08/2013
002,#Biology;A;01/01/2013#Math;C;03/10/2013
001,#Math;A;02/20/2013#Literature;B;03/02/2013#Biology;B;05/01/2013
当然,这是一个丑陋的黑客代码,只是为了向您展示如何在 python 中完成它。处理大量数据流时,请使用 generators和 iterators ,并且不要使用 file.readlines()
,just iterate 。迭代器不会一次读取所有数据,而是在迭代它们时逐 block 读取,而不是更早读取。
如果您担心 200m 记录是否适合内存,请执行以下操作:
按学生 ID 将记录分类到单独的“存储桶”中(如 bucket sort )
cat all_records.txt | grep 001 > Stud_001.txt # 如果其他学生也这样做
对每个桶进行处理
合并
grep
只是示例。制作一个更高级的脚本(awk 或 python),它将按学生 ID 进行过滤,例如过滤所有 ID < 1000 的内容,稍后过滤 1000 < ID < 2000 的内容,依此类推。您可以安全地进行操作,因为每个学生的记录是不相交的。
关于python - 如何在Python中聚合记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16618401/
我是一名优秀的程序员,十分优秀!