我有 20GB 以上的 csv 文件,如下所示:
**CallId,MessageNo,Information,Number**
1000,1,a,2
99,2,bs,3
1000,3,g,4
66,2,a,3
20,16,3,b
1000,7,c,4
99,1,lz,4
...
我必须按 CallId 和 MessageNo 作为 asc 订购此文件。 (一种方式是load database->sort->export)
在 C# 中,如何在不将所有行加载到内存的情况下对这个文件进行排序? (就像使用 streamreader 逐行一样)
你知道解决方案的图书馆吗? 我等你的建议, 谢谢
最佳答案
您应该使用操作系统排序命令。通常它只是
sort myfile
接着是一些神秘的开关。这些命令通常适用于大文件,并且通常可以选择在其他物理硬盘驱动器上指定临时存储。看这个previous question , 和 Windows sort
命令 "man" page .由于 Windows 排序不足以解决您的特定排序问题,您可能需要使用 GNU coreutils它将 linux sort
的强大功能带到了 Windows。
解决方案
这是您需要做的。
- 下载GNU Coreutils Binaries ZIP并将
sort.exe
从 bin 文件夹中提取到您机器上的某个文件夹中,例如您要排序的文件所在的文件夹。 - 下载GNU Coreutils Dependencies ZIP并将两个
.dll
文件提取到与sort.exe
相同的文件夹中
现在假设您的文件如下所示:
1000,1,a,2
99,2,bs,3
1000,3,g,4
66,2,a,3
20,16,3,b
1000,7,c,4
99,1,lz,4
你可以在命令提示符下写:
sort.exe yourfile.csv -t, -g
输出:
20,16,3,b
66,2,a,3
99,1,lz,4
99,2,bs,3
1000,1,a,2
1000,3,g,4
1000,7,c,4
参见 more command options here .如果这是您想要的,请不要忘记使用 -o
开关提供输出文件,如下所示:
sort.exe yourfile.csv -t, -g -o sorted.csv
关于c# - 如何在不加载到内存的情况下对大型 csv 文件进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7361074/