需要在 Windows 中对带有标题行的大型 CSV 类文件进行排序(约 700 万行)。可以使用 CMD 命令 sort 成功执行此操作,但排序中包含标题行。我想将其保留在顶部。
我也有具有排序功能的 Notepad++,但是它无法处理我最大的两个文件(已报告错误)。
我愿意接受涉及 CMD 排序命令和其他解决方案的建议,最好是可以在 CMD 或 PowerShell 中编写脚本的建议(我还不太擅长)。
答案1
在 Powershell 中这非常容易做到,因为 Powershell 默认可以正确处理标头。
Import-Csv -Delimeter ',' FILENAME | Sort -Property "Column name" | Export-Csv -NoTypeInformation -Delimeter ',' -Path NEW_FILENAME
Delimiter 参数(在导入和导出时)指定列分隔符。我使用了逗号,但有些 CSV 使用分号。
-NoTypeInformation 可防止导出包含数据类型信息,而这通常是您想要的。
将 FILENAME 替换为原始文件名,将 NEWFILENAME 替换为所需的输出名称。
将“Column name”替换为您想要作为排序键的列的名称(与标题中的拼写相同)。使用多个 -Property 参数对多个列进行排序。
答案2
这有一些行长度限制,但基本思想是运行命令来获取第一行(这里是以 set 开头的行),然后运行命令来获取其余行并对其进行排序。这看起来相当紧凑,可能适用于许多情况,但如果不适用,这些帖子提供了替代方案:
- 获得第一行https://stackoverflow.com/questions/130116/windows-batch-commands-to-read-first-line-from-text-file
- 获得除第一行以外的所有内容https://stackoverflow.com/questions/50530309/how-to-remove-first-line-from-a-text-file-with-cmd
代码
set /p header=< input.csv && echo %header% > output.csv
more +1 input.csv | sort >> output.csv
这种变体也有效
(
set /p header=< input.csv && echo %header%
more +1 input.csv | sort
) > output.csv