使用powershell处理海量数据文件

使用powershell处理海量数据文件,powershell,exception,memory,high-volume,Powershell,Exception,Memory,High Volume,我正在尝试对4GB的数据文件执行替换操作。 但由于内存异常,我甚至无法读取此文件。 以下命令给出一个内存错误 $edwfile = (Get-Content C:\Users\tomgeorg\Desktop\edw_ord_extr_3x_SIQP_20181021.182305\edw_ord_extr_3x_SIQP_20181021.182305.dat -Raw ) 是否有其他命令或技巧来处理巨大的文件 我想在文件的每一行上运行以下替换模式。基本上,我想删除所有不需要的特殊字符 -

我正在尝试对4GB的数据文件执行替换操作。 但由于内存异常,我甚至无法读取此文件。 以下命令给出一个内存错误

$edwfile = (Get-Content C:\Users\tomgeorg\Desktop\edw_ord_extr_3x_SIQP_20181021.182305\edw_ord_extr_3x_SIQP_20181021.182305.dat -Raw ) 
是否有其他命令或技巧来处理巨大的文件

我想在文件的每一行上运行以下替换模式。基本上,我想删除所有不需要的特殊字符

-replace  "[$([char]0x00)-$([char]0x09)$([char]0x0B)-$([char]0x1F)$([char]0x7F)-$([char]0xFF)]","?"
系统详细信息


假设您希望一次只在一条线上工作,您将希望使用管道完成任务:

$path = '~\Desktop\edw_ord_extr_3x_SIQP_20181021.182305\edw_ord_extr_3x_SIQP_20181021.182305.dat'
Get-Content -Path $path | ForEach-Object {
    # do something line-by-line with the file
} | # -> do something else with the output

如果不知道您正在对该文件执行什么操作,则很难给出更完整的答案。

假设您希望一次只处理一行,您将希望使用管道完成任务:

$path = '~\Desktop\edw_ord_extr_3x_SIQP_20181021.182305\edw_ord_extr_3x_SIQP_20181021.182305.dat'
Get-Content -Path $path | ForEach-Object {
    # do something line-by-line with the file
} | # -> do something else with the output

如果不知道您正在对文件执行什么操作,很难给出更完整的答案。

下面是使用streams的示例解决方案。它逐行读取文件,然后将更新的行添加到新文件中

$reader = [System.IO.StreamReader]"C:\temp\OriginalFile.txt"
$writer = [System.IO.StreamWriter]"C:\temp\UpdatedFile.txt"

while (!$reader.EndOfStream) {

$writer.WriteLine(($reader.ReadLine() -replace '\|', ";"))

}

$reader.Close()
$writer.Close()

下面是带有流的示例溶液。它逐行读取文件,然后将更新的行添加到新文件中

$reader = [System.IO.StreamReader]"C:\temp\OriginalFile.txt"
$writer = [System.IO.StreamWriter]"C:\temp\UpdatedFile.txt"

while (!$reader.EndOfStream) {

$writer.WriteLine(($reader.ReadLine() -replace '\|', ";"))

}

$reader.Close()
$writer.Close()

不要对大文件使用
-Raw
。您需要使用管道、
-ReadCount
-Stream
、或上述组合对其进行分块处理。注意:目前,您只是在演示如何将整个文件加载到单个变量中;所以我们不能给你比@TheIncorrigible1之前的评论更多的帮助。如果您需要更多帮助,请分享有关您的流程的信息/理想情况下分享相关代码,我们可以建议如何更好地实施此建议。此外,不要将
获取内容
放在子表达式/分组表达式中,也不要将其输出分配给变量。使用管道一次处理一行文件。有些人使用
Get Content-ReadCount
。许多人求助于
System.IO.StreamReader
来提高性能。不要对大文件使用
-Raw
。您需要使用管道、
-ReadCount
-Stream
、或上述组合对其进行分块处理。注意:目前,您只是在演示如何将整个文件加载到单个变量中;所以我们不能给你比@TheIncorrigible1之前的评论更多的帮助。如果您需要更多帮助,请分享有关您的流程的信息/理想情况下分享相关代码,我们可以建议如何更好地实施此建议。此外,不要将
获取内容
放在子表达式/分组表达式中,也不要将其输出分配给变量。使用管道一次处理一行文件。有些人使用
Get Content-ReadCount
。许多人求助于
System.IO.StreamReader
来提高性能。