Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PowerShell在文本文件中组织此位置数据(json输出)?_Json_Powershell_Parsing_Text - Fatal编程技术网

如何使用PowerShell在文本文件中组织此位置数据(json输出)?

如何使用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

每行以路径开头,以结尾}

我想把它组织成一个表格,标题是“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.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