我有一个包含多个用户的文本文件(格式正确):
用户名:T-汉考克
phoneNumber:555555555
用户名:A-史密斯
PhoneNumber:987654321
用户名:R-拜尔
phonenumber:123456789
我正在尝试将所有这些用户放入具有两个属性(名称和电话号码)的对象中。 我尝试了Get-Content,尝试了其他帖子中的一些正则表达式,但我无法修改它们因为我不理解它。
怎么可以这样做?
答案 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文件的屏幕截图。
答案 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')
}
}