在PowerShell中检查大型CSV文件中的所有行

t5zmwmid  于 2023-01-03  发布在  Shell
关注(0)|答案(1)|浏览(192)

我想使用超过300,000行的CSV文件。我需要逐行验证信息,然后以表格形式显示在.txt文件中,以查看所有服务器缺少哪个文件。例如

Name,Server
File1,Server1
File2,Server1
File3,Server1
File1,Server2
File2,Server2
...
File345,Server76
File346,Server32

我想以表格形式显示与上面示例对应的结果:

Name     Server1 Server2 ... Server 32 ....Server 76
File1       X       X
File2       X       X
File3       X       
...
File345                                       X
File346                          X

实际上,为了做到这一点,我有一个函数,它创建的对象的成员是服务器名称(成员对象的数量可以改变),我使用流读取器来拆分数据(我的csv中有超过2列,所以0是服务器名称,5是文件名)

$stream = [System.IO.StreamReader]::new($File)
$stream.ReadLine()  | Out-Null
while ((-not $stream.EndOfStream)) {
    $line = $stream.ReadLine()
    $strTempo = $null
    $strTempo = $line -split ","
    $index = $listOfFile.Name.IndexOf($strTempo[5])
    if ($index -ne -1) {   
        $property = $strTempo[0].Replace("-", "_")
        $listOfFile[$index].$property = "X"
    }
    else {
        $obj = CreateEmptyObject ($listOfConfiguration)
        $obj.Name = $strTempo[5]
        $listOfFile.Add($obj) | Out-Null
    }
}

当我导出这个时,我有一个相当好的结果。但是脚本花费了太多的时间(20分钟到1小时)
我不知道如何优化脚本,我是PowerShell的初学者。
谢谢你的未来提示

waxmsbnn

waxmsbnn1#

看看这是否工作得更快。根据需要更改文件名

$Path = "C:\temp\test1.txt"
$table = Import-Csv -Path $Path
$columnNames = $table | Select-Object -Property Server -Unique| foreach{$_.Server} | Sort-Object
Write-Host "names = " $columnNames
$groups = $table | Group-Object {$_.Name}

$outputTable =  [System.Collections.ArrayList]@()
foreach($group in $groups)
{
   Write-Host "Group = " $group.Name
   $newRow = New-Object -TypeName psobject
   $newRow | Add-Member -NotePropertyName Name -NotePropertyValue $group.Name
   $servers = $group.Group | Select-Object -Property Server | foreach{$_.Server}
Write-Host "servers = " $servers
   foreach($item in $columnNames)
   {
      if($servers.Contains($item))
      {
         $newRow | Add-Member -NotePropertyName $item -NotePropertyValue 'X'
      }
      else
      {
         #if you comment out next line code doesn't work
         $newRow | Add-Member -NotePropertyName $item -NotePropertyValue ''
      }
   }
   $outputTable.Add($newRow)  | Out-Null
   
}
$outputTable | Format-Table

相关问题