Как организовать эти данные о местоположении (вывод в формате json) в текстовый файл с помощью PowerShell? - PullRequest
0 голосов
/ 20 декабря 2018
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 строк текстового файла с сотнями других, так что имейте это в виду.

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Предполагается, что данные находятся в файле 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

Пожалуйста, дайте мне знать, если это поможет, и не забудьте пометить его как ответ :).

0 голосов
/ 20 декабря 2018

Предполагая, что файл input.txt содержит данные, такие как ваши входные данные образца, должно работать следующее:

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

-replace '.*: (?=\{)' удаляет префикс из каждой строки ввода, используя регулярное выражение, возвращая только JSONpart:

  • .*: соответствует любой последовательности символов, за которой следует : и пробел.
  • (?=\{) - это предварительное утверждение ((?=...)), соответствующее одному{ (экранируется как \{, потому что { имеет особое значение в регулярных выражениях
  • Поскольку обходные утверждения не считаются частью подстроки, сопоставленной регулярному выражению, каждая строка сопоставляется только до пробела до {, который запускает JSON-часть, и, заменяя совпадающую часть пустой строкой (неявно, потому что строка замены не указана), он фактически удаляется из каждогострока, оставляя только часть JSON.

Передача результата в ConvertFrom-Json дает коллекцию пользовательских объектов, свойства которых отражают ввод JSON, приводя к dтребуемый табличный вывод по умолчанию.

0 голосов
/ 20 декабря 2018

Вы можете попробовать следующее:

$ parsedJson = Get-Content $ fileRoute |ConvertFrom-Json

...