我下载了一个包含以下格式数据的txt文件:
“data1”:111,“data2”:22,“data3”:3,“data4”:4444444,等等。
我需要提取数据:
$data1 = 111
$data2 = 22
$data3 = 3
...and so on.
我该怎么做?
答案 0 :(得分:3)
假设文件与您描述的完全一致,您要提取的数据以逗号分隔。您可以使用Get-Content cmdlet检索文件内容。
Get-Content myFile.txt | Out-String
上面的命令将Get-Content输出管道输出到单个字符串。否则,如果文件有多行,那么您可以检索collection个字符串。在这种情况下,最好使用单个字符串,因为您可以根据分隔值将split
字符串添加到集合中。例如:
PS C:\> $string = '"data1":111,"data2":22,"data3":3,"data4":4444444'
PS C:\> $data = $string.split(",")
PS C:\> $data
"data1":111
"data2":22
"data3":3
"data4":4444444
从那里,您可以通过识别需要删除的内容将字符串分解为数值。看起来像以前的一切,包括冒号。所以我们希望-replace
这些值,如下所示:
# Create an empty array to store the parsed data.
PS C:\> $parsedData = @()
# For each element in the $data array, replace content up to the first colon.
PS C:\> foreach($i in $data) { $parsedData += $i -replace ".*:", "" }
PS C:\> $parsedData
111
22
3
4444444
从那里,将这些数组元素重新分配给你喜欢的任何变量名称都是微不足道的。您可能希望在about_Comparison_Operators上查看string manipulation或此博客,以获得有关解决此类问题的更一般性介绍。
最后,这些键值对非常适合Hash Table数据结构。当您对powershell感觉更舒服时,请务必查看。与你提出的解决方案相比,它最终会提供一种更清晰的方式来处理你的数据......虽然简单的数组也很好,如果密钥只是" dataX"。
答案 1 :(得分:1)
使用spilled,然后使用split for“data2”:22',然后获取子字符串。
#method 1
$rawTxt='"data1":111,"data2":22,"data3":3,"data4":4444444'
$rawTxt -split ',' | ForEach-Object {
$temp= $_ -split ':'
"{0}={1}" -f $temp[0].Substring(1,$temp[0].Length-2),$temp[1]
} | ConvertFrom-StringData
#method 2
$rawTxt = '"data1":111,"data2":22,"data3":3,"data4":4444444,"data5":589'
$regex = [regex] '"(?<name>\w*)":(?<value>\d*),?'
$match = $regex.Match($rawTxt)
while ($match.Success) {
[PSCustomObject]@{
Name = $match.Groups['name'].Value
Value = $match.Groups['value'].Value
}
$match = $match.NextMatch()
}
答案 2 :(得分:1)
试试这个
Get-Content "c:\temp\test.txt" -delimiter "," | ConvertFrom-String -Delimiter ":" -PropertyNames Part1, Part2