Данные из текстового файла - PullRequest
0 голосов
/ 11 июля 2019

У меня есть текстовый файл toto.txt с таким содержанием:

     Time: 11/23/2018 17:03:46
     User: NEON
     Web Site: https://www.seznam.cz
     Top

     Time: 11/23/2018 17:05:10
     User: NEON
     Web Site: www.autojournal.cz%252Fstat-prodava-zabavena-auta-padouchu-budou-levnejsi-nez-jine-ojetiny-2%252F/keFrdPDIZzLJBC2fxX7EIQ?utm_source=www.seznam.cz&utm_medium=sekce-z-internetu
      Top

 Time: 11/23/2018 17:05:11
 User: NEON
 Web Site: www.autojournal.cz/stat-prodava-zabavena-auta-padouchu-budou-levnejsi-nez-jine-ojetiny-2/?utm_source=www.seznam.cz&utm_medium=sekce-z-internetu
  Top
 ... etc. ...

Код для экспорта данных:

 ((Get-Content C:\Users\user\Desktop\test\toto.txt -RAW) -split '\n(?=Time:)') | % {
     $x = $_ -split '\r'
     New-Object PSOBJECT -Property @{
         Time  = [regex]::Match($x[0],'(?<=Time:\s*)\b.*\b')
         User = [regex]::Match($x[1],'(?<=User:\s*)\b.*\b')
         Web = [regex]::Match($x[2],'(?<=Site:\s*)\b.*\b')
     }
 } | out-file  C:\Users\user\Desktop\test\result.txt

Проблема в том, что длинные URL-адреса (веб-сайты) не находятся в result.txt.

А мне нужна структура result.txt:

datetime; $ url, например: 2019-01-15 15: 06: 03; $ www.autojournal.cz / стат-prodava-zabavena-Auta-padouchu-BuDou-levnejsi-пег-Jiné-ojetiny-2 / utm_source = www.seznam.cz & utm_medium = sekce-г-* в Интернет 1011 *

И в result.txt я получаю: 23.11.2008 17:05:10 NEON www.autojournal.cz% 252Fstat-prodava-zabavena-Auta-padouchu-BuDou-levnejsi-пег-Jiné-ojetiny-2% 25 ...

Дата и время, которые я могу конвертировать:

 (Get-Content C:\Users\user\Desktop\test\result.txt) | 
 Foreach-Object {$_ -replace "([0-9]+)/+([0-9]+)/+([0-9]+)", '$3-$1-$2'} | 
 Foreach-Object {$_ -replace "([0-9]+):+([0-9]+):+([0-9]+)", '$1-$2-$3;$'} |
 Set-Content C:\Users\user\Desktop\test\result2.txt


((Get-Content C:\Users\user\Desktop\test\toto.txt -RAW) -split'\n(?=Time:)') | % {
 $x = $_ -split '\r'
 New-Object PSOBJECT -Property @{
     Time  = [regex]::Match($x[0],'(?<=Time:\s*)\b.*\b')
     User = [regex]::Match($x[1],'(?<=User:\s*)\b.*\b')
     Web = [regex]::Match($x[2],'(?<=Site:\s*)\b.*\b')
 } } | out-file  C:\Users\user\Desktop\test\result.txt

 (Get-Content C:\Users\user\Desktop\test\result.txt) |  Foreach-Object {$_ -replace "([0-9]+)/+([0-9]+)/+([0-9]+)", '$3-$1-$2'} | Foreach-Object {$_ -replace "([0-9]+):+([0-9]+):+([0-9]+)", '$1-$2-$3;$'} | Set-Content C:\Users\user\Desktop\test\result2.txt

1 Ответ

0 голосов
/ 11 июля 2019

Out-File имеет параметр «Ширина». Вы можете использовать его, чтобы остановить короткую линию

((Get-Content C:\Users\user\Desktop\test\toto.txt -RAW) -split '\n(?=Time:)') | % {
    $x = $_ -split '\r'
    New-Object PSOBJECT -Property @{
        Time  = [regex]::Match($x[0],'(?<=Time:\s*)\b.*\b')
        User = [regex]::Match($x[1],'(?<=User:\s*)\b.*\b')
        Web = [regex]::Match($x[2],'(?<=Site:\s*)\b.*\b')
    }
} | out-file  C:\Users\user\Desktop\test\result.txt -Width 10000

Вам также следует изучить работу с CSV-файлами с помощью Import-Csv, Export-Csv и [PSCustomObjects]. Это намного проще, чем разбивать текстовые файлы.

((Get-Content C:\Users\user\Desktop\test\toto.txt -RAW) -split '\n(?=Time:)') | % {
    $x = $_ -split '\r'
    New-Object PSOBJECT -Property @{
        Time  = [regex]::Match($x[0],'(?<=Time:\s*)\b.*\b')
        User = [regex]::Match($x[1],'(?<=User:\s*)\b.*\b')
        Web = [regex]::Match($x[2],'(?<=Site:\s*)\b.*\b')
    }
} | Export-Csv C:\Users\user\Desktop\test\result.txt -Delimiter ";" -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...