首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析PowerShell中的文本文件

问解析PowerShell中的文本文件
EN

Stack Overflow用户
提问于 2015-05-02 07:36:12
回答 3查看 7.1K关注 0票数 0

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

用户名:t-Hancock phoneNumber: 555555555 用户名:a-smith PhoneNumber: 987654321 用户名:r-Byer 电话号码: 123456789

我试图让所有这些用户进入一个具有两个属性(姓名和电话号码)的对象。我尝试了获取内容,尝试了其他帖子中的正则表达式,但是我无法修改它们,因为我不理解它。

这是怎么做到的呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-02 08:55:53

你在这里想要什么还不完全清楚--什么类型的物体,以及为了什么目的?

我来举一个例子说明能做些什么.

假设您希望将该文本文件转换为CSV文件,以便轻松导入Excel,从读取文件内容开始:

代码语言:javascript
复制
$input = Get-Content C:\TextFile.txt

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

代码语言:javascript
复制
$array = @()

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

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

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

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

这在整个文件内容中都会重复:

代码语言:javascript
复制
$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文件:

代码语言:javascript
复制
$array | Export-Csv -path C:\test.csv -NoTypeInformation

所以,完整的脚本是:

代码语言:javascript
复制
$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文件的截图。

​

​

票数 3
EN

Stack Overflow用户

发布于 2015-05-02 08:26:28

我建议你把你的格式改为CSV,这样就很简单了。只需使用进口-Csv。

现在您可以做一些很长的行,它假设为有效的文本文件,没有空行:

代码语言:javascript
复制
$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.
票数 0
EN

Stack Overflow用户

发布于 2015-05-02 08:33:00

我会使用雷克斯获取数据(下面的例子),您可能需要调整regexs来提取名称和数字,因为我只需要继续使用您的小示例,并且我已经做了一些假设,比如在名称和数字中没有空格。

代码语言:javascript
复制
((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')
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29999682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档