在PowerShell中解析文本文件

时间:2015-05-02 07:36:13

标签: regex parsing powershell powershell-v3.0

我有一个包含多个用户的文本文件(格式正确):

  

用户名:T-汉考克

     

phoneNumber:555555555

     

用户名:A-史密斯

     

PhoneNumber:987654321

     

用户名:R-拜尔

     

phonenumber:123456789

我正在尝试将所有这些用户放入具有两个属性(名称和电话号码)的对象中。 我尝试了Get-Content,尝试了其他帖子中的一些正则表达式,但我无法修改它们因为我不理解它。

怎么可以这样做?

3 个答案:

答案 0 :(得分:1)

这不完全清楚你想要什么 - 什么样的对象和目的?

我将举例说明可以做什么......

假设您要将该文本文件转换为CSV文件以便于导入Excel,请先阅读文件内容:

$input = Get-Content C:\TextFile.txt

现在,创建一个数组,您将在其中存储您创建的每个对象:

$array = @()

现在,我们将进入循环,解析文件内容。如果该行以“username”开头,则使用冒号作为分隔符拆分该行,将第二个项目(0-相对,因此第二个项目为第一个)抓取到变量中。

如果该行以“PhoneNumber”开头,则将$writeobj变量设置为true(在循环的每次迭代开始时重置为false)并将“PhoneNumber”值存储在$PhoneNumber中再次分裂。

然后检查$writeobj是否为真,如果是,则创建一个新对象,添加一个名称为Username的NoteProperty和存储在文件中前一行的用户名值。

然后添加一个名为PhoneNumber且值为$PhoneNumber的NoteProperty。然后,将对象添加到数组中。

这一直重复文件内容:

$input | foreach-object {
    $writeobj = $false
    $obj = New-Object System.Object
    If ($_ -match 'username*') {
        $Username = ($_ -split ':')[1]
    }
    If ($_ -match 'PhoneNumber*') {
        $PhoneNumber = ($_ -split ':')[1]
        $writeobj = $true
    }
    If ($writeobj){
        $obj | Add-Member -type NoteProperty -name Username -value $Username
        $obj | Add-Member -type NoteProperty -name PhoneNumber -value $PhoneNumber
        $array += $obj
    }
}

一旦我们离开循环,将数组导出为CSV文件:

$array | Export-Csv -path C:\test.csv -NoTypeInformation

所以,完整的脚本是:

$input = Get-Content C:\TextFile.txt
$array = @()
$input | foreach-object {
    $writeobj = $false
    $obj = New-Object System.Object
    If ($_ -match 'username*') {
        $Username = ($_ -split ':')[1]
    }
    If ($_ -match 'PhoneNumber*') {
        $PhoneNumber = ($_ -split ':')[1]
        $writeobj = $true
    }
    If ($writeobj){
        $obj | Add-Member -type NoteProperty -name Username -value $Username
        $obj | Add-Member -type NoteProperty -name PhoneNumber -value $PhoneNumber
        $array += $obj
    }
}
$array | Export-Csv -path C:\test.csv -NoTypeInformation

请参阅以下在Excel中打开的CSV文件的屏幕截图。

Example CSV file opened in Excel

答案 1 :(得分:0)

我建议您将格式更改为CSV,然后它非常简单。只需使用Import-Csv

现在你可以做很多行,它假定有效的文本文件,没有空行:

$content = Get-Content "C:\Users\You\Documents\test.txt"
$readUsername = $true
$data = @()
foreach ($line in $content)
{
    if($readUsername -eq $true) {
      $username = .. # Match the line against regex.
      $readUsername = $false
    } else {
       $phone = .. # Match the line against regex
       $readUsername = $true

       # We have grabbed username & phone
       $props = @{Name: $username, Phone: $phone}
       $obj = New-Object PSObject –Property $props
       $data += $obj
    }
}

# You now have access to $data.

答案 2 :(得分:0)

我会使用regexes来获取数据(例如下面的代码),你可能需要调整正则表达式以提取名称和数字,因为我只有你的小样本继续我做了一些假设,比如名字和数字中没有空格。

((Get-Content file.txt -Raw) -split '\n(?=username)') | % {
    $x = $_ -split '\r'
    New-Object PSOBJECT -Property @{
        name  = [regex]::Match($x[0],'(?<=username:\s*)\b.*\b')
        phone = [regex]::Match($x[1],'(?<=[Pp]hone[Nn]umber:\s*)\b.*\b')
    }
}