首页 > 解决方案 > Powershell Script:最快删除大文件中大量行的最佳方法是什么?

问题描述

我被我的 PowerShell 脚本阻止了……完成这项工作的时间太长了。请,我需要你的帮助来使用更好的方法来删除文件中的很多行。

我解释上下文:

我输入了两个文件。File1:客户编号和活动列表,如下所示:

  1. 730;12345678
  2. 710;11223344
  3. 732;89898989
  4. (ETC。)

这个文件是用户填写的,所以它可能包含 10 行或 1000 行

我在数组列表中添加了这个文件:

$MyArrayList = New-Object -TypeName "System.Collections.ArrayList"
$File1 = get-content "file1.txt"
foreach($Client in $File1)
{
         $DetailClient = $Client.split(";")
         $NumAct = $DetailClient[0]
         $NumClient = $DetailClient[1]
         $MyArrayList.Add($NumAct)
         $MyArrayList.Add($NumClient)
}

File2:它是一个流文件,有 100 000 行(平均),看起来像这样

LP RC05808 094100008832970954001000088329 12345678 000006
UO RC05808 094107 13596710435866 CAR 000001001000001
UO RC05808 094109 COP 000013001000013
UO RC05808 094110 PAL 000013011000143
LT RC05808 09410000000207700000003190PE0109202015092020R 730
LT RC05808 09410000000207700000003190PE0109202015092020R 720
LR RC05808 094124082020150920202 002 000000170000V N 720 2133 01CAR
UL RC05808 09412 002 CAR 07 102 V
LR RC05808 094124082020150920202 003 000000060000V N 720 2133 01CAR
UL RC05808 09412 003 CAR 07 36 V
LR RC05808 094124082020150920202 004 000000050000V N 730 2133 01CAR
UL RC05808 09412 004 CAR 07 30 V
LR RC05808 094124082020150920202 005 000000100000V N 730 2133 01CAR
UL RC05808 09412 005 CAR 07 60 V

在这个文件中,我需要为每个匹配的客户端做,保存它以构建另一个文件并在这个文件中删除它,就像这样:对于每个 LP 行,检查 file1 中是否存在数字客户端,如果是,请查看 LT如果此客户端的活动存在于文件中,则删除该行,如果是,则删除它,如果是,则删除每个带有活动编号的 LR 行和后面的每个 UL 行

对于删除的每一行,我需要保存一些信息(在本例中,为 LP、UL 和 LR 行保存 000006、004、005、30、60)来构建 csv 文件。

我希望很清楚:S

我尝试完全读取 file2 并保存所有信息,然后再次读取 file2 以删除行:

$File2 = get-content "file2.txt"
$SaveOPC = New-Object -TypeName "System.Collections.ArrayList"
foreach($Fope in $File2)
{
      $Typeline = $Fope.substring(0,2)
      IF($Typeline -eq "LP")
      {
            $ClientLP = $Fope.substring(58,8)
            IF($MyArrayList.Contains($ClientLP))
            {
                 $empAct = (($MyArrayList.IndexOf($ClientLP)) -1)
                 $arrayAct = $MyArrayList.Item($emplacementAct)
                 $Keyline = $Fope.substring(3,21)
                 $SaveOPC.Add($Keyline)
                 $SaveOPC.Add($arrayAct)
            }
      }
      #[...] i do other task for every case but not useful for here
}

#delete line, it's here my problem, it's very long...
for($i=0; $i -lt $SaveOPC.count;$i=$i+2)
{
        $key = $SaveOPC.Item($i)
        $act = $SaveOPC.Item($i+1)
        $regexlrlt = '^(LR|LT) ('+$key+').*'+$act+'.*\n(UL) ('+$key+').*'
        (Get-Content "file2.txt" -Raw) -replace $regexlrlt, '' | Set-Content 'file2.txt'
}
# next i delete emply line
(Get-Content "file2.txt") | ? {$_.trim() -ne "" } | Set-Content "file2.txt"

#[...] then i build csv file

在此示例中,客户端编号 12345678 与 file1 匹配,因此我必须删除带有 730 的 Line LT、带有 730 的 LR 行和下一个 UL 行

所以,我的问题是如何最快地删除所有匹配的行......我逐行尝试,通过正则表达式,通过行号等提前谢谢

标签: powershell-3.0

解决方案


推荐阅读