我有一个包含多个用户的文本文件(格式准确):
用户名:t-Hancock phoneNumber: 555555555 用户名:a-smith PhoneNumber: 987654321 用户名:r-Byer 电话号码: 123456789
我试图让所有这些用户进入一个具有两个属性(姓名和电话号码)的对象。我尝试了获取内容,尝试了其他帖子中的正则表达式,但是我无法修改它们,因为我不理解它。
这是怎么做到的呢?
发布于 2015-05-02 08:55:53
你在这里想要什么还不完全清楚--什么类型的物体,以及为了什么目的?
我来举一个例子说明能做些什么.
假设您希望将该文本文件转换为CSV文件,以便轻松导入Excel,从读取文件内容开始:
$input = Get-Content C:\TextFile.txt现在,创建一个数组,将所创建的每个对象存储在其中:
$array = @()现在,我们将进入一个循环,解析文件内容。如果行以"username“开头,则使用冒号分隔行,将第二项(0-相对的,因此第二项是第一项)获取到变量中。
如果行以"PhoneNumber“开头,则将$writeobj变量设置为true (在循环每次迭代开始时将其重置为false ),并再次使用split将"PhoneNumber”值存储在$PhoneNumber中。
然后检查$writeobj是否为真,如果是,创建一个新对象,添加一个用户名和用户名值的NoteProperty,该名称和用户名值存储在文件中的前一行。
然后添加一个名称为NoteProperty、PhoneNumber和值为$PhoneNumber的$PhoneNumber。然后,将对象添加到数组中。
这在整个文件内容中都会重复:
$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文件的截图。

发布于 2015-05-02 08:26:28
我建议你把你的格式改为CSV,这样就很简单了。只需使用进口-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.发布于 2015-05-02 08:33:00
我会使用雷克斯获取数据(下面的例子),您可能需要调整regexs来提取名称和数字,因为我只需要继续使用您的小示例,并且我已经做了一些假设,比如在名称和数字中没有空格。
((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')
}
}https://stackoverflow.com/questions/29999682
复制相似问题