【问题标题】:How can I organize this location data (json output) in a text file using PowerShell?如何使用 PowerShell 在文本文件中组织此位置数据(json 输出)?
【发布时间】:2019-05-20 12:54:55
【问题描述】:
C:\temp\GeoDATA.txt:39:Content           : {"ip":"68.55.28.227","city":"Plymouth","region_code":"MI","zip":"48170"}
C:\temp\GeoDATA.txt:56:Content           : {"ip":"72.95.198.227","city":"Homestead","region_code":"PA","zip":"15120"}
C:\temp\GeoDATA.txt:73:Content           : {"ip":"68.180.94.219","city":"Normal","region_code":"IL","zip":"61761"}
C:\temp\GeoDATA.txt:90:Content           : {"ip":"75.132.165.245","city":"Belleville","region_code":"IL","zip":"62226"}
C:\temp\GeoDATA.txt:107:Content           : {"ip":"97.92.20.220","city":"Farmington","region_code":"MN","zip":"55024"}

每一行都以路径开头,以结束 }

我想将其组织为一个表格,标题为“ip、city、region_code、zip”,每个标题下方都有相应的数据。像这样的...

ip              city         region_code    zip 
68.55.28.227    Plymouth     MI             48170
72.95.198.227   Homestead    PA             15120
68.180.94.219   Normal       IL             61761
75.132.165.245  Belleville   IL             62226
97.92.20.220    Farmington   MN             55024

这是一个文本文件的前 5 行,还有数百行,所以请记住这一点。

【问题讨论】:

    标签: json powershell parsing text


    【解决方案1】:

    假设数据在 test.txt 文件中。

    试试这个:

    $Data = $null
    $Table  = @()
    
    $Data = Get-Content C:\Users\lt\AppData\Local\Temp\test.txt
    
    
    $Data | %{
        $IP = (($_ -split "{")[1] -split "," -split ":")[1] -replace "`"",""
        $City = (($_ -split "{")[1] -split "," -split ":")[3] -replace "`"",""
        $Region_Code = (($_ -split "{")[1] -split "," -split ":")[5] -replace "`"",""
        $ZIP = (($_ -split "{")[1] -split "," -split ":")[7] -replace "}","" -replace "`"",""
    
        $Table += "$IP,$City,$Region_Code,$ZIP"
    }
    
    ConvertFrom-Csv -Header "IP","City","Region_Code","ZIP" -InputObject $Table
    

    如果这有帮助,请告诉我,不要忘记将其标记为答案:)。

    【讨论】:

    • 鉴于输入行包含有效的 JSON 字符串,首先将输入转换为 CSV 似乎很复杂。一般来说,最好避免迭代地“扩展”数组,因为实际上每次使用+= 时都必须在后台分配一个新数组,因为数组是固定大小 数据结构。
    • @mklement0 有趣...您将如何改进解决方案?
    • 请看我的回答。
    • 谢谢!仍然给了我想要的输出,并教了我一些关于语法的东西。我很感激。
    【解决方案2】:

    假设文件 input.txt 包含与您的示例输入数据类似的数据,则以下内容应该有效:

    (Get-Content input.txt) -replace '.*: (?=\{)' | ConvertFrom-Json
    

    -replace '.*: (?=\{)' 使用正则表达式从每个输入行中去除前缀​​,仅返回 JSON 部分:

    • .*:  匹配任何后跟: 和空格的字符序列。
    • (?=\{) 是一个前瞻断言 ((?=...)),它匹配单个 {(转义为 \{,因为 { 在正则表达式中具有特殊含义
    • 由于环视断言不被视为正则表达式匹配的子字符串的一部分,因此每行仅匹配到空格 before 开始 JSON 部分的{,并通过替换与空字符串匹配的部分(隐含地,因为没有给出替换字符串),它实际上从每一行中删除,只留下 JSON 部分。

    将结果传送到ConvertFrom-Json 会生成一组自定义对象,其属性反映 JSON 输入,默认情况下会生成所需的表格输出。

    【讨论】:

    • 我确实有一个后续问题:我拥有的较大列表中的许多 IP 要么不再有效,要么在美国以外,它们返回一个或多个字段的“null”值.有什么方法可以排除没有填充所有三个字段(City、Region_Code、Zip)的行?
    • @JohnnyCarino:假设空值在 JSON 中表示为空字符串或null,您可以通过管道传递到Where-Object { $_.city.length -gt 0 -and $_.region_code.length -gt 0 -and $_.zip.length -gt 0 }。如果您需要进一步的帮助,请创建一个新的问题(如果您需要我的帮助,请随时联系我)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多