gpt4 book ai didi

powershell - [System.IO.File]::ReadAllText内存不足异常,带有大CSV

转载 作者:行者123 更新时间:2023-12-02 23:08:24 24 4
gpt4 key购买 nike

我有一个简单的PowerShell脚本,将“false”或“true”替换为“0”或“1”:

$InputFolder = $args[0];
if($InputFolder.Length -lt 3)
{
Write-Host "Enter a path name as your first argument" -foregroundcolor Red
return
}
if(-not (Test-Path $InputFolder)) {
Write-Host "File path does not appear to be valid" -foregroundcolor Red
return
}
Get-ChildItem $InputFolder
$content = [System.IO.File]::ReadAllText($InputFolder).Replace("`"false`"", "`"0`"").Replace("`"true`"", "`"1`"").Replace("`"FALSE`"", "`"0`"").Replace("`"TRUE`"", "`"1`"")
[System.IO.File]::WriteAllText($InputFolder, $content)
[GC]::Collect()

这对于我必须修改的几乎所有文件都适用,除了一个808MB CSV以外。
我不知道此CSV中有多少行,因为我什么也打不开。

有趣的是,当直接通过PowerShell或通过命令提示符手动调用时,PowerShell脚本将成功完成。
当它作为SSIS包的一部分启动时,即发生错误。

该文件的样本数据:
"RowIdentifier","DateProfileCreated","IdProfileCreatedBy","IDStaffMemberProfileRole","StaffRole","DateEmploymentStart","DateEmploymentEnd","PPAID","GPLocalCode","IDStaffMember","IDOrganisation","GmpID","RemovedData"     
"134","09/07/1999 00:00","-1","98","GP Partner","09/07/1999 00:00","14/08/2009 15:29","341159","BRA 871","141","B83067","G3411591","0"

引发错误消息:

PowerShell Error Message

我不受PowerShell的束缚-我愿意接受其他选择。以前我有一个Ccri脚本,但是死在比这个小的文件上-我不是C#开发人员,所以根本无法调试它。

任何建议或帮助将不胜感激。

最佳答案

  • 通常,避免一次全部读取大文件,因为您可能会遇到内存不足的情况。
  • 而是逐行处理基于文本的文件-读写。
  • 虽然PowerShell通常在逐行(逐个对象)处理方面表现出色,但是对于包含多行的文件来说速度较慢。
  • 虽然更复杂,但直接使用.NET Framework可以提供更好的性能。
  • 如果逐行处理输入文件,则无法直接写回该文件,而必须写入一个临时输出文件,如果成功,您可以将其替换为输入文件。

  • 这是出于性能原因直接使用.NET类型的解决方案:
    # Be sure to use a *full* path, because .NET typically doesn't have the same working dir. as PS.
    $inFile = Convert-Path $Args[0]
    $tmpOutFile = [io.path]::GetTempFileName()

    $tmpOutFileWriter = [IO.File]::CreateText($tmpOutFile)
    foreach ($line in [IO.File]::ReadLines($inFile)) {
    $tmpOutFileWriter.WriteLine(
    $line.Replace('"false"', '"0"').Replace('"true"', '"1"').Replace('"FALSE"', '"0"').Replace('"TRUE"', '"1"')
    )
    }
    $tmpOutFileWriter.Dispose()

    # Replace the input file with the temporary file.
    # !! BE SURE TO MAKE A BACKUP COPY FIRST.
    # -WhatIf *previews* the move operation; remove it to perform the actual move.
    Move-Item -Force -LiteralPath $tmpOutFile $inFile -WhatIf

    注意:

    假定使用
  • UTF-8编码,并且重写的文件将没有BOM。您可以通过为.NET方法指定所需的编码来更改此设置。
  • 顺便说一句:使用不区分大小写的PowerShell的.Replace()运算符,可以按如下方式简化每条输入行上的-replace调用链:因此,只需要替换两个即可:$line -replace '"false"', '"0"' -replace '"true"', '"1"'但是,尽管编写起来比较短,但实际上它比.Replace()调用链慢,这可能是因为-replace基于正则表达式,这会引起额外的处理。
  • 关于powershell - [System.IO.File]::ReadAllText内存不足异常,带有大CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52541281/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com