如何以逗号分隔格式提取键值对的值?

时间:2013-09-22 05:51:23

标签: powershell

我下载了一个包含以下格式数据的txt文件:

  

“data1”:111,“data2”:22,“data3”:3,“data4”:4444444,等等。

我需要提取数据:

$data1 = 111
$data2 = 22   
$data3 = 3
...and so on.

我该怎么做?

3 个答案:

答案 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