gpt4 book ai didi

powershell - 如何在Powershell中以预定义的字符串拆分非常大的文本文件(4GB),并快速完成

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

我有一个大型文本文件World.net(其中是Pajek文件,但将其视为文本),其内容为:

*Vertices 999999
1 "" 0.2931 0.2107 0.5000 empty
2 "" 0.2975 0.2214 0.5000
3 "" 0.3083 0.2258 0.5000
4 "" 0.3127 0.2406 0.5000
5 "" 0.3083 0.2514 0.5000
6 "" 0.3147 0.2578 0.5000
...
999999 "" 0.3103 0.2622 0.5000
*Edges :2 "World contours"
1 2 1
2 3 1
3 4 1
4 5 1
5 6 1
6 7 1
...
983725 8 1

我想将其分割为不同的.txt文件,以

*[Something]



[内容]应该输入文件名,例如World_Vertices.txt和World_Edges.txt。

文件内容应为原始文件中每个类别(顶点,边线)之后的行(1、2、3 ...),没有类别名称(以*开头)。

我有一个(种类)有效的代码:
$filename = "World"
echo $pwd\"$filename.net"
$file = New-Object System.IO.StreamReader -Arg "$pwd\$filename.net"
while (($line = $file.ReadLine()) -ne $null) {
If ($line -match "^\*\w+") {
$newfile = -join("$filename ","$($line.Split('\*')[1]).txt")
echo $newfile
}
Else {
$line | Out-File -Append $newfile
}
}

但是这段代码很慢。 10 mb的文件需要20分钟。
而且我希望能够处理4GB的文件。

硬件说明:机器不错:配备混合磁盘,16GB内存的i7,我可以安装.net框架,以完成工作。

编辑1:最终代码
修复了可接受的答案中的一些错误,这是我使用的最终代码(这对于想要编辑大型pajek文件的任何人都可能有帮助):
$filename = "World.net"
$file = New-Object System.IO.StreamReader -Arg "$pwd\$filename"
$writer = $null
$n = 0
while (($line = $file.ReadLine()) -ne $null) {
If ($line.StartsWith("*")) {
$n = 1
$newfile = -join("$filename ","$($line.Split('\*')[1]).txt")
echo $newfile
if ($null -ne $writer) {
$writer.Dispose()
}
$writer = New-Object System.IO.StreamWriter "$pwd\$newfile"
}
Else {
If ($n -eq 0){
$writer.WriteLine()
}
$writer.Write($line)
$n = 0
}
}
$writer.Dispose()

最佳答案

通常,在性能很重要的情况下,在PowerShell中使用.NET函数始终是最佳方法。因此,使用StreamReader已经是一个好方法。

我将您的代码更改为使用StreamWriter写入输出文件:

$filename = "World"
echo "$pwd\$filename.net"
$file = New-Object System.IO.StreamReader -Arg "$pwd\$filename.net"
$writer = $null
while (($line = $file.ReadLine()) -ne $null) {
If ($line -match "^\*\w+") {
$newfile = -join("$filename ","$($line.Split('\*')[1]).txt")
echo $newfile
if ($null -ne $writer) {
$writer.Dispose()
}
$writer = New-Object System.IO.StreamWriter "$pwd\$newfile"
}
Else {
$writer.WriteLine($line)
}
}

尝试一下。

还有其他方法可以进一步改善您的效果。例如,您可能会跳过昂贵的正则表达式检查。使用此代替:
if ($line.StartsWith("*"))

关于powershell - 如何在Powershell中以预定义的字符串拆分非常大的文本文件(4GB),并快速完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46293895/

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