c# - 如何在不加载到内存的情况下对大型 csv 文件进行排序

标签 c# file sorting csv

我有 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。

解决方案

这是您需要做的。

  1. 下载GNU Coreutils Binaries ZIP并将 sort.exe 从 bin 文件夹中提取到您机器上的某个文件夹中,例如您要排序的文件所在的文件夹。
  2. 下载GNU Coreutils Dependencies ZIP并将两个 .dll 文件提取到与 sort.exe
  3. 相同的文件夹中

现在假设您的文件如下所示:

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/

相关文章:

c# - 为什么要在任务中使用多个重复的方法实现?

c# - 是否可以使用属性更改 WCF 服务的 ServiceHostFactory?

c# - 如何创建一个 web Api 具有 http post 功能,它可以从正文中获取任何动态 json 内容并能够将其解析为字符串

java - 在Java中创建给定大小的文件

c# - Silverlight DataGrid 中列的不同默认排序顺序

linux - random() 在 Linux 中函数相同的值(同时 grof ing)

c# - 上下文菜单继续使用Mvvm获取错误的对象

c - fread() 和 fwrite 在 C 编程中的工作原理

c# - 尝试复制另一个进程拥有的文件会导致 DirectoryNotFoundException 吗?

c - 为什么这段代码在选择排序中给出段错误,请解释