如何使用Powershell中的换行符从文本文件中捕获数据

时间:2014-03-19 23:36:37

标签: powershell powershell-v2.0 powershell-v3.0

我有一大堆文本文件,我试图解析为powershell,似乎无法找到一种方法来做我想要的事情。我基本上有长文本文件与数据组在一起,并由换行符分隔。所有组合在一起的数据都属于一起,并且需要转换为PowerShell对象或数组进行操作。我不需要任何操作数据的帮助,我只需要一种方法将数据分成块。例如,一个文本文件可能类似于

group=name1
member=user1
member=user2
member=user3

group=name2
member=user1
member=user4
member=user5

group=name3
member=user1
member=user2

group=name4
member=user2
member=user4
member=user5
member=user6

我只需要一种方法通过get-content将其拉入powershell,并且每当到达换行符时都会有新的对象或需要创建/完成的任何内容来存储新数据。我能够实现我追求的目标,但只是花了相当多的时间将xml标签添加到花费很长时间的所有东西上。任何方向或帮助都会受到很大关注。

2 个答案:

答案 0 :(得分:2)

  • 拥有群组的哈希表。
  • 迭代文件内容。
    • 当您点击"组=" line,添加到具有组名的哈希表,指向一个新数组。
    • 当你点击"成员=" line,将名称添加到组数组中。

e.g。

$groups = @{}

foreach ($line in Get-Content .\t.txt) {
    if ($line -match "group") {
        $current_group = $line.Split("=")[1]
        $groups[$current_group] = @()
    }
    if ($line -match "member") {
        $name = $line.Split("=")[1]
        $groups[$current_group] += $name
    }
}

write $groups

您发布的输入的示例输出:

Name                           Value                                                                                      
----                           -----                                                                                      
name1                          {user1, user2, user3}                                                                      
name2                          {user1, user4, user5}                                                                      
name3                          {user1, user2}                                                                             
name4                          {user2, user4, user5, user6}  

然后,您可以使用$groups.keys列出所有群组,并使用$groups['name1']直接获取这些群组等。

答案 1 :(得分:2)

由于您需要对象,这是另一个选项([ordered]和[PSCustomObject]类型加速器需要V3:

#Define a script block to create an empty hash table for object schema
$NewHT = {
 $HT = 
 [ordered]@{
   Group = ''
   Members = New-Object collections.arraylist
  }
}

#Dot source the script block to create a new hash table
.$NewHT

#Create objects from input
$NewObjects = 
Switch -Regex (Get-Content file.txt)
{
  '^Group='    { $HT.Group = $_.split('=')[1] }

  '^Member='   { [void]$HT.Members.Add($_.split('=')[1]) }

  '^\s*$'      {
                 if ($HT.Group)
                  {
                   [PSCustomobject]$HT
                   .$NewHT
                  }
               }

  Default      {Write-Warning "Unrecognized line: `n`n $_"}
}

使用您发布的数据的结果:

 $NewObjects | ft -AutoSize

Group Members              
----- -------              
name1 {user1, user2, user3}
name2 {user1, user4, user5}
name3 {user1, user2} 

该模式适用于您描述的空行分隔组的任何文件,并且在创建对象之前不需要任何临时存储分组数据的情况下生成对象。只要所有必需数据都可用,就会创建对象。