将多个大型csv文件与Powershell合并时出现内存错误

将多个大型csv文件与Powershell合并时出现内存错误,powershell,csv,Powershell,Csv,对于如何使用Powershell将多个CSV文件合并为一个文件的问题,有一些很好的回答,除了中的第一个文件外,所有文件都会删除标题行。 Kemiler2002发布的答案在大多数情况下对我来说都很好,但是当输出文件超过2GB时,我开始出现内存不足异常错误。将抛出以下错误消息 Exception of type 'System.OutOfMemoryException' was thrown. At xxx.ps1:9 char:20 + $false {$lines | Se

对于如何使用Powershell将多个CSV文件合并为一个文件的问题,有一些很好的回答,除了中的第一个文件外,所有文件都会删除标题行。
Kemiler2002发布的答案在大多数情况下对我来说都很好,但是当输出文件超过2GB时,我开始出现内存不足异常错误。将抛出以下错误消息

Exception of type 'System.OutOfMemoryException' was thrown.
At xxx.ps1:9 char:20
+            $false {$lines | Select -Skip 1}
+                    ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], OutOfMemoryException
    + FullyQualifiedErrorId : System.OutOfMemoryException  
这是在使用Powershell 5.1。MaxMemoryPerShellMB(报告为2147483647)似乎没有问题,实际系统内存也没有问题-上次我运行此程序时,剩余的可用内存为33GB(总共64GB)

现在脚本继续运行,并添加到文件中(我最后的一个文件大小约为7GB),但当我看到出现此错误时,我无法确定它是否捕获了所有文件中的每一行

有什么建议吗

编辑


我添加了一些输出,以便查看错误发生的位置。我添加了11个文件,大小从350MB到1GB不等。。。是这两个1GB左右的文件导致了错误。一个报告的长度为909050983,另一个报告的长度为973429260。

我没有一个大文件来测试这一点,但是使用.net方法可能是一种替代方法,因为您可以一次只处理一行,而不是将整个内容加载到内存中

$filepath = "c:\temp"
$outputfile = "c:\temp\output\result.csv"
$encoding = [System.Text.Encoding]::UTF8

$files = Get-ChildItem -Path $filePath -Filter *.csv

$w = New-Object System.IO.StreamWriter($outputfile, $true, $encoding)

$skiprow = $false
foreach ($file in $files)
{
    $r = New-Object System.IO.StreamReader($file.fullname, $encoding)
    while (($line = $r.ReadLine()) -ne $null) 
    {
        if (!$skiprow)
        {
            $w.WriteLine($line)
        }
        $skiprow = $false
    }
    $r.Close()
    $r.Dispose()
    $skiprow = $true
}

$w.close()
$w.Dispose()

有些人用这种方法做这件事简直是疯了

获取内容$SrcFile1,$SrcFile2 |设置内容$DstFile

别那样做!它的速度慢得可笑,并且总是导致内存异常错误。相反,使用来自命令处理器的良好旧文件副本,例如


cmd/c“copy$($SrcFile1)+$($SrcFile2)$($DstFile)”

好吧,最简单的方法是确保您运行的是64位powershell实例,而不是32位实例。是的,对不起,我应该提到它是以64位运行的。我明天会试一试。。。。但我认为这将是非常缓慢的。使用UltraEdit手动编辑标题,然后将文件复制到一起,再添加回标题行,可能更有效。啊!当然,我也可以编写这些手动组件的脚本-将头文件从第一个文件复制到临时文件中,去掉所有文件的头文件,将它们一起复制到临时主体文件中,然后合并临时主体文件和临时主体文件。哇。。。实际上,启动脚本只是为了让它在一夜之间运行,事实证明它比我使用的另一个脚本要高效得多。另一个脚本花了大约40分钟来处理这11个文件,而这里只花了10分钟,您的脚本完成了75%。毫不犹豫地仔细阅读了两个大文件。对不起,我会投票支持你的答案,将其标记为答案,但我没有足够的声誉。我如何在其中设置编码选项?我的源文件中的口音都被弄乱了。我知道有一种方法可以设置StreamWriter的编码,但我不确定如何以您调用它的方式进行设置。