powershell遍历一个大文件
powershell iterating through a large file
你好,我刚刚启动了 powershell,我正在使用一个 powershell 脚本来遍历一个包含行的大文件,例如 "ABCD#######";"####";"@@";## ;"@@";####;#####;"@";.我需要在 powershell 中做的是遍历这个可能包含 20,000 多行的文件,并从每一行中获取部分信息并将其输出到另一个文件。我有那个工作,问题是它真的很慢,想知道是否有人可以帮助这是我的代码。
foreach ($fileName in (ls i.gft1* | %{$_.name})){
$fileNo=1
$STUFFCount=0
cd work
new-item flttemp$fileNo -type file -force
cat $fileName | %{$_.replace('"','')} > temp
foreach ($line in (cat temp)){
echo $containerCount
if ($STUFFCount -eq 999)
{
$fileNo=$fileNo+1
$STUFFCount=0
break;
new-item flttemp$fileNo -type file
}
add-content flttemp$fileNo "STUFF_START" -encoding utf8
add-content flttemp$fileNo "STUFF"-encoding utf8
$no=$line.split(";")[0]
if ($line.substring("3","1") -eq "U")
{
add-content flttemp$fileNo "STUFF_TYPE:STUFF" -encoding utf8
}
else
{
add-content flttemp$fileNo "STUFF_TYPE:STUFF" -encoding utf8
}
add-content flttemp$fileNo "STUFF_NO:$no" -encoding utf8
add-content flttemp$fileNo "STUFF_NOTO:$no" -encoding utf8
$ISO=$line.split(";")[1]
add-content flttemp$fileNo "STUFF_ISO:$ISO" -encoding utf8
$weight=$line.split(";")[5]
if ($weight -gt 0)
{
$weight=2.20462 * $weight
$weight=$weight.tostring("#.##")
add-content flttemp$fileNo "STUFF_WGT:$weight" -encoding utf8
}
else
{
add-content flttemp$fileNo "STUFF_WGT:" -encoding utf8
}
$weight=$line.split(";")[6]
if ($weight -gt 0)
{
$weight=2.20462 * $weight
$weight=$weight.tostring("#.##")
add-content flttemp$fileNo "STUFF_MWGT:$weight" -encoding utf8
}
else
{
add-content flttemp$fileNo "STUFF_MWGT:" -encoding utf8
}
add-content flttemp$fileNo "}STUFF_END" -encoding utf8
$STUFFCount=$STUFFCount+1
}
}
代码有效(如果编辑没有遗漏任何东西)只是这个的 kornshell 版本在 1 分钟内完成了 flttemp$fileNo 文件,而它需要 powershell 4-5 分钟,这太慢了这个脚本需要经过许多文件。我的问题又是,有没有一种方法我不使用优化 powershell 来更快地读取文件。
您可以尝试将每个文件完全读入内存,然后对其进行处理。这肯定会在处理大文件时加快速度
foreach ($fileName in (ls i.gft1* | %{$_.name}))
{
$fileString = [IO.File]::ReadAllText("$filename") # gives you one string containing whole file
# or
$lines = [IO.File]::ReadAllLines("$filename") # gives a collection of strings (lines)
foreach ($line in $lines)
{
# $line is a line (string)
}
}
你好,我刚刚启动了 powershell,我正在使用一个 powershell 脚本来遍历一个包含行的大文件,例如 "ABCD#######";"####";"@@";## ;"@@";####;#####;"@";.我需要在 powershell 中做的是遍历这个可能包含 20,000 多行的文件,并从每一行中获取部分信息并将其输出到另一个文件。我有那个工作,问题是它真的很慢,想知道是否有人可以帮助这是我的代码。
foreach ($fileName in (ls i.gft1* | %{$_.name})){
$fileNo=1
$STUFFCount=0
cd work
new-item flttemp$fileNo -type file -force
cat $fileName | %{$_.replace('"','')} > temp
foreach ($line in (cat temp)){
echo $containerCount
if ($STUFFCount -eq 999)
{
$fileNo=$fileNo+1
$STUFFCount=0
break;
new-item flttemp$fileNo -type file
}
add-content flttemp$fileNo "STUFF_START" -encoding utf8
add-content flttemp$fileNo "STUFF"-encoding utf8
$no=$line.split(";")[0]
if ($line.substring("3","1") -eq "U")
{
add-content flttemp$fileNo "STUFF_TYPE:STUFF" -encoding utf8
}
else
{
add-content flttemp$fileNo "STUFF_TYPE:STUFF" -encoding utf8
}
add-content flttemp$fileNo "STUFF_NO:$no" -encoding utf8
add-content flttemp$fileNo "STUFF_NOTO:$no" -encoding utf8
$ISO=$line.split(";")[1]
add-content flttemp$fileNo "STUFF_ISO:$ISO" -encoding utf8
$weight=$line.split(";")[5]
if ($weight -gt 0)
{
$weight=2.20462 * $weight
$weight=$weight.tostring("#.##")
add-content flttemp$fileNo "STUFF_WGT:$weight" -encoding utf8
}
else
{
add-content flttemp$fileNo "STUFF_WGT:" -encoding utf8
}
$weight=$line.split(";")[6]
if ($weight -gt 0)
{
$weight=2.20462 * $weight
$weight=$weight.tostring("#.##")
add-content flttemp$fileNo "STUFF_MWGT:$weight" -encoding utf8
}
else
{
add-content flttemp$fileNo "STUFF_MWGT:" -encoding utf8
}
add-content flttemp$fileNo "}STUFF_END" -encoding utf8
$STUFFCount=$STUFFCount+1
}
}
代码有效(如果编辑没有遗漏任何东西)只是这个的 kornshell 版本在 1 分钟内完成了 flttemp$fileNo 文件,而它需要 powershell 4-5 分钟,这太慢了这个脚本需要经过许多文件。我的问题又是,有没有一种方法我不使用优化 powershell 来更快地读取文件。
您可以尝试将每个文件完全读入内存,然后对其进行处理。这肯定会在处理大文件时加快速度
foreach ($fileName in (ls i.gft1* | %{$_.name}))
{
$fileString = [IO.File]::ReadAllText("$filename") # gives you one string containing whole file
# or
$lines = [IO.File]::ReadAllLines("$filename") # gives a collection of strings (lines)
foreach ($line in $lines)
{
# $line is a line (string)
}
}