有没有办法按列标题名称(垂直排序)对csv文件进行排序,而不将整个内容加载到内存中?我将其标记为python,因为它是我最熟悉的语言,但任何其他方式也可以。由于数据保护规则,我仅限于通过远程计算机上的命令行执行此操作。
答案 0 :(得分:3)
任何磁盘上排序算法都需要更多的磁盘操作,而不仅仅是读写一次,并且I / O可能是您的瓶颈。而且它也会变得更加复杂。所以,除非你真的不能将文件放入内存中,否则这样做会快得多,而且简单得多。
但如果你必须这样做......
标准的磁盘排序算法是一种合并排序,类似于熟悉的内存中合并排序。它的工作原理如下:
将文件拆分为足以容纳内存的块。你可以反复/懒惰地轻松地做到这一点:一次只读100MB。只需确保rfind最后一个换行符,然后在下一个换行符后保留所有内容。
对于每个块,在内存中对其进行排序,并将结果写入临时文件。您可以使用csv
模块,将sort
功能与key=itemgetter(colnum)
一起使用。
如果您有10个或更少的块,只需打开所有临时文件并合并它们即可。同样,您可以使用csv
模块,min
使用相同的密钥或heapq.merge
使用相同的decorate-sort-undecorate。
如果你有10-100个块,将10个组合并为更大的临时文件,然后以完全相同的方式合并更大的文件。使用100-1000或1000-10000等,只需递归地执行相同的操作。
如果您有一个没有引用/转义的简单CSV文件,并且您有ASCII数据,要按字符顺序排序的ASCII超集数据,或者要根据{{1}排序的ASCII超集数据,POSIX sort
命令正是您正在寻找的,就像您可能自己构建它一样。像这样:
LC_COLLATE
如果您的数据不符合这些要求,您可以进行“装饰 - 排序 - 不合格”三通解决方案。但在那时,切换到Python可能更容易。试图找出sort -t, -k ${colnum},${colnum} -i infile.csv -o outfile.csv
如何sed
将任意Excel CSV转换为sort
可以处理的内容,并且可以反过来听起来像是在浪费更多时间调试边缘情况而不是编写Python。