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

ogu*_*h4n 10 c# csv sorting file

我有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 
...
Run Code Online (Sandbox Code Playgroud)

我必须通过CallId和MessageNo将此文件命名为asc.(一种方法是加载数据库 - >排序 - >导出)

如何在不将所有行加载到c#内存的情况下对此文件进行排序?(比如使用streamreader逐行)

你知道一个解决方案库吗?我等你的意见,谢谢

Gle*_*eno 6

您应该使用OS排序命令.通常它只是

sort myfile
Run Code Online (Sandbox Code Playgroud)

接着是一些神秘的开关.这些命令通常适用于大文件,并且通常有选项可以在其他物理硬盘上指定临时存储.请参阅此前一个问题,以及Windows sort命令"man"页面.由于Windows排序不足以满足您的特定排序问题,因此您可能希望使用GNU coreutils 将Linux的强大功能sort带到Windows.

这是你需要做的.

  1. 下载GNU Coreutils二进制文件ZIPsort.exe从bin文件夹中提取到计算机上的某个文件夹,例如您要排序的文件所在的文件夹.
  2. 下载GNU Coreutils依赖项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 
Run Code Online (Sandbox Code Playgroud)

你可以在命令提示符下写:

sort.exe yourfile.csv -t, -g
Run Code Online (Sandbox Code Playgroud)

哪个会输出:

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
Run Code Online (Sandbox Code Playgroud)

在此处查看更多命令选项.如果这是您想要的,请不要忘记提供带-o开关的输出文件,如下所示:

sort.exe yourfile.csv -t, -g -o sorted.csv
Run Code Online (Sandbox Code Playgroud)

  • @ oguzh4n我已经用详细的*howto*更新了我的答案. (2认同)