gpt4 book ai didi

PowerShell : Divide Files by Line in Faster Way

转载 作者:行者123 更新时间:2023-12-04 16:37:12 25 4
gpt4 key购买 nike

我们正在考虑分割超过 25GB 的大文件并导入到 Redshift DWH 中。到目前为止,我们可以简单地将文件分成1000000行,但是分成111个文件花了将近两个小时。

$i=1; cat .\TRGET_FILE.csv -ReadCount 1000000 | % { $_ > TRGET_FILE_$i.csv;$i++ }

我们还想在每个文件中将单词“\”转义为“\\”,以免阻止 Redshift 数据加载。但是这样既费时又费资源。

如果您知道更好的解决方案,能否请您告诉我?谢谢。

最佳答案

catGet-Content 的别名,它读取文件的速度非常慢。我还怀疑使用重定向可能也不是编写目标文件的最佳方式。

让我们尝试使用一些 .Net 类和方法:

$bigfile = '.\TRGET_FILE.csv'
$outfile = '.\TRGET_FILE{0:d5}.csv'
$linecount = 1000000
$i = 0
$outstream = $null

foreach ($line in [System.IO.File]::ReadLines($bigfile)) {
if (($i % $linecount) -eq 0) {
if ($null -ne $outstream) { $outstream.Close() }
$outstream = [System.IO.StreamWriter]::new(($outfile -f ($i/$linecount)))
}

$outstream.WriteLine($line.Replace('\', '\\'))

$i++
}
$outstream.Close()

[System.IO.File]::ReadLines 方法非常快,我们可以使用 foreach 循环快速迭代它,而无需从中读取每一行首先是文件。

由于循环的每次迭代处理一行,我们将把它写到目标文件中。但是我们不想使用像 Out-File -Append 这样的东西,因为它每次都会重新打开和关闭文件。

因此,当我们计算出达到行数时(或在第一次迭代时),我们可以打开一个新文件作为 [System.IO.File]::StreamWriter,这样我们就已经打开它了,并且可以写出每一行。

当我们编写该行时,我们还将单个反斜杠 \ 字符替换为两个反斜杠。

当我们达到所需的行数时,我们首先检查 $outstream 是否为 $null(它将是 $null第一次),如果它不为空,我们将关闭流(以关闭输出文件),然后使用新文件名创建一个新流。

输出文件名通过字符串模板模板化为 5 位数字。{0:d5} -- 0表示模板中的第一项,d代表一个数字,5 > 告诉它确保数字至少为 5 位数字,因此它将用零填充。这将有助于文件排序。

最后,在循环的末尾,循环将在达到所需的行数(文件的尾部)之前结束,我们关闭最后一个流。

頠弣っテね

关于PowerShell : Divide Files by Line in Faster Way,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68354389/

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