2

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

"data1":111,"data2":22,"data3":3,"data4":4444444,以此类推。

我需要提取数据,以便:

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

我怎样才能做到这一点?

4

3 回答 3

3

假设文件与您描述的完全一样,您要提取的数据以逗号分隔。您可以使用Get-Content cmdlet检索文件内容。

Get-Content myFile.txt | Out-String  

上面的命令通过管道将 Get-Content 的输出输出到单个字符串。否则,如果文件有多行,那么您可以检索字符串集合。在这种情况下,最好使用单个字符串,因为您可以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或此关于字符串操作的博客,以更全面地介绍解决此类问题。


最后,这类键值对非常适合哈希表数据结构。当您对 powershell 感觉更舒服时,请务必检查一下。与您提出的解决方案相比,它最终会提供一种更简洁的方式来处理您的数据……尽管如果密钥只是“dataX”,那么一个简单的数组也可能很好。

于 2013-09-22T06:00:18.277 回答
1

使用 spilt,然后对 '"data2":22' 使用 split,然后获取子字符串。

#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()
}
于 2013-09-22T09:21:33.913 回答
1

尝试这个

Get-Content "c:\temp\test.txt" -delimiter "," | ConvertFrom-String -Delimiter ":" -PropertyNames Part1, Part2
于 2017-01-29T10:52:46.003 回答