如何使用PowerShell在文本文件中组织此位置数据(json输出)?
每行以路径开头,以结尾} 我想把它组织成一个表格,标题是“ip,city,region_code,zip”,每个标题下都有相应的数据。像这样的如何使用PowerShell在文本文件中组织此位置数据(json输出)?,json,powershell,parsing,text,Json,Powershell,Parsing,Text,每行以路径开头,以结尾} 我想把它组织成一个表格,标题是“ip,city,region_code,zip”,每个标题下都有相应的数据。像这样的 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.22
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"}
这是文本文件的前5行,还有数百行,请记住。假设数据在test.txt文件中 试试这个:
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
请让我知道这是否有帮助,不要忘记将其标记为答案:)。假设文件
input.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
-replace'.*:(?=\{)
使用正则表达式从每个输入行剥离前缀,仅返回JSON部分:
匹配任何后跟*:
和空格的字符序列:
是一个前瞻性断言((?=\{)
),它匹配单个(?=…)
(转义为{
),因为\{
在正则表达式中有特殊含义{
- 由于lookaround断言不被视为正则表达式匹配的子字符串的一部分,因此每一行只匹配到启动JSON部分的
之前的空格,并用空字符串替换匹配部分(隐式地,因为没有给出替换字符串),它被有效地从每一行中删除,只留下JSON部分{
通过管道将结果从Json传输到
ConvertFrom Json
会生成一个自定义对象集合,其属性反映Json输入,默认情况下会生成所需的表格输出。鉴于输入行包含有效的Json字符串,因此首先将输入转换为CSV似乎很复杂。一般来说,最好避免使用itera“延伸”一个数组,因为实际上每次使用+=
时都必须在幕后分配一个新数组,因为数组是固定大小的数据结构。@mklement0很有趣……您将如何改进解决方案?请查看我的答案。谢谢!仍然给了我所需的输出,并教了我一些语法方面的知识。我很感激。我确实有一个后续问题:我拥有的较大列表中的许多IP要么不再有效,要么在美国境外,它们返回一个“null”值,一个或多个字段。有没有办法排除没有全部三个字段(城市、地区代码、邮政编码)的行填充?@JohnnyCarino:假设空值在JSON中表示为空字符串或null
,您可以通过管道连接到Where对象{$\ city.length-gt 0-和$\ region\u code.length-gt 0-以及$\ zip.length-gt 0}
。如果您需要进一步的帮助,请创建一个新问题(如果你需要我的帮助,请随时打电话给我)。
(Get-Content input.txt) -replace '.*: (?=\{)' | ConvertFrom-Json