如何使用 Windows Batch 读取和编辑 (>3GB) csv 文件?

Posted

技术标签:

【中文标题】如何使用 Windows Batch 读取和编辑 (>3GB) csv 文件?【英文标题】:How to read and edit (>3GB) csv file using Windows Batch? 【发布时间】:2021-07-21 13:43:07 【问题描述】:

我正在使用下面的 FOR-IN-DO 语法来读取并获取 (>3GB) csv 文件的最后一行

For /F "UseBackQ Delims==" %%A In (test.csv) Do Set "lastline=%%A"

代码适用于小文件。但是,FOR-IN-DO 无法打开大的 csv 文件。这个问题有解决办法吗?

【问题讨论】:

批量做这样的事情是个坏主意。即使有可能,它也会非常低效。为什么不使用更好的脚本工具,如 powershell 或 python? 将 csv 用于大型数据结构也很糟糕。为此目的,有许多更好的二进制格式 FOR 命令将整个文件读入内存。由于 cmd.exe 是 32 位程序,因此文件大小限制为 2,147,483,647 字节。如果您想获取文件的最后一行,我建议您使用为此目的设计的工具。它们是在 Windows 上运行的命令 TAIL 的许多端口。我认为您甚至可以致电 Powershell 来完成此操作。 @Squashman 在 64 位 Windows 上分别在 %windir%\System32%windir%\SysWOW64 中有 64 位和 32 位 cmd.exe 谢谢@phuclv。我也会尝试使用批处理来运行 powershell 或 vb 脚本来做到这一点。 【参考方案1】:

根据您的源文件的内容,即 CSV 不是 TAB 分隔的,或者包含您需要保留的 TAB 字符,您也许可以做到像这样:

Set "SourceFile=test.csv"
For /F %%G In ('%SystemRoot%\System32\find.exe /C /V "" 0^<"%SourceFile%"') Do Set /A "TotalLines=%%G-1"
For /F Delims^=^ EOL^= %%G In ('%SystemRoot%\System32\more.com +%TotalLines% 0^<"%SourceFile%"') Do Set "LastLine=%%G"

根据您的评论,我将对上述内容进行以下修改:

Set "SourceFile=%UserProfile%\Desktop\test.csv"
Set "DestinationDir=%UserProfile%\Documents"
Set "LineMatch=Specific String"
For /F %%G In ('%SystemRoot%\System32\find.exe /C /V "" 0^<"%SourceFile%"') Do Set /A "TotalLines=%%G-1"
For /F Delims^=^ EOL^= %%G In ('%SystemRoot%\System32\more.com +%TotalLines% 0^<"%SourceFile%"') Do If /I "%%G" == "%LineMatch%" Move /Y "%SourceFile%" "%DestinationDir%"

【讨论】:

请注意,这个例子是重现用文件的最后一行填充变量的内容,它复制了你自己的代码For /F "UseBackQ Delims==" %%A In (test.csv) Do Set "lastline=%%A"。有关修改该文件最后一行内容的任何内容都是另一个问题,因此我的上述回复中没有涉及。 谢谢。我认为这已经足够好了,我想要的是读取 CSV 的最后一行,如果 "%lastline%" == "%specific_string%",我会将 CSV 文件移动到另一个目录。 根据您的评论@plm0998,我在上面的答案中添加了一个附加示例,希望对您有所帮助。

以上是关于如何使用 Windows Batch 读取和编辑 (>3GB) csv 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Batch 中分别读取平面文件头和正文

Spring Batch - 如何使用一个读取其他步骤的作者的并行步骤?

如何使用 Spring Batch 读取一个单元格中包含多行的 CSV 文件?

Spring Batch - 循环读取器、处理器和写入器 N 次

Windows Batch:如何添加主机条目?

Spring Batch中如何读取多个CSV文件合并数据进行处理?