Цикл PowerShell foreach с одинаковой датой для всех итераций - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь разобрать .txt файл через каталоги (эта часть в порядке). Эти файлы являются отчетами и содержат списки серийных номеров, мне также удалось получить хороший список. Каждый файл содержит много последовательных и одну дату, я хотел бы создать массив, где первый столбец будет серийным номером, а второй - повторяющейся датой, и именно там я потерпел неудачу. Как повторить эту дату для всех сериалов и оформить ее в файл CSV?

Пример файла для разбора: Имя файла: [Калибровка - Проверка] [Sonde T Cryo] [17-01-2019 14h51mn24] .txt

Début de <<Calibrage / Vérification>>,  <<Sonde T Cryo>> Le 17-01-2019  14h51mn24

******************************************************************************
** Conditions de mesures                                                    **
******************************************************************************
Nom de l'opérateur :  AF
Condition de mesures : 
    Température :  21°C
    Hygrométrie :  40%HR
    Préssion atmosphérique :  980 HPA
Commentaire :  NIM F85 / NIM F317 / NIM F100 / NOUVELLES SONDES NUMT 3M. 12199


Période de mesure = 15s
Nombre de point de mesure = 5

******************************************************************************
** Mesure Sonde en mode VERIFICATION (Moyenne)                              **
******************************************************************************
        Mesure Brut                 Moyenne
Palier 1  (17-01-2019  23h51mn24)
Sonde 01    -18,263 -18,263 -18,263 -18,293 -18,263     -18,269
Sonde 02    -18,351 -18,361 -18,371 -18,341 -18,351     -18,355
Sonde 03    -18,336 -18,336 -18,326 -18,346 -18,336     -18,336
Sonde 05    -18,357 -18,357 -18,357 -18,357 -18,337     -18,353

******************************************************************************
** Contrôle d’anomalie de la mesure                                         **
** Ecart max toléré entre la sonde et la Ref est de +-10°C                  **
******************************************************************************
Aucune anomalie constatée



******************************************************************************
** Les appareils ci-dessous sont Calibrés Et Vérifiés.                      **
******************************************************************************
Le seuil de tolerance est : +/- 0,2°C

Sonde n°01 [ AE190150013]           Sonde n°02 [ AE190150014]           
Sonde n°03 [ AE190150017]           Sonde n°05 [ AE190150018]           
Sonde n°06 [ AE190150015]           Sonde n°07 [ AE190150020]           
Sonde n°08 [ AE190150012]           Sonde n°09 [ AE190150016]           
Sonde n°10 [ AE190150011]           Sonde n°11 [ AE190150019]           
Sonde n°20 [ AE190150001]           Sonde n°21 [ AE190150002]           


******************************************************************************
** Les appareils ci-dessous n'ont pas passés le test de calibrage.          **
******************************************************************************
Sonde n°04 [            ]           Sonde n°22 [            ]           
Sonde n°23 [            ]           Sonde n°24 [            ]           
Sonde n°25 [            ]           Sonde n°26 [            ]           
Sonde n°27 [            ]           Sonde n°28 [            ]           
Sonde n°29 [            ]           Sonde n°30 [            ]           
Sonde n°31 [            ]           Sonde n°32 [            ]           

Fin de <<Calibrage / Vérification>>,  <<Sonde T Cryo>> Le 18-01-2019  04h52mn54

Что я хотел бы получить: дата в первой строке и только серийные номера между "Les appareils ci-dessous sont Calibrés Et Vérifiés." и "Les appareils ci-dessous n'ont pas passés le test de calibrage."

        $data = 'C:\Users\user\Desktop\DEV\2019\2019_01 Janvier\*.txt'

[char[]]$replace = '!@#$%^&*(){}[]":;,<>/|\+=`~ '''
$regex = ($replace | % {[regex]::Escape($_)}) -join '|'
Get-ChildItem $data -recurse |
  Where-Object { $_.Name -match $RegEx} |
    Rename-Item -NewName {$_.Name -replace $RegEx, '_'}

(Get-ChildItem $data -recurse).FullName |
  Foreach-Object {
   (Get-Content $_ -Raw).
        Replace('** Les appareils ci-dessous sont Calibrés Et Vérifiés.                      **','§').
        Replace("Le seuil de tolerance est:+/-0,2°C",' ').
        Replace("Leseuildetoleranceest:+/-0,2°C",'').
        Replace("Le seuil de tolerance est:+/-0,3°C",' ').
        Replace("Leseuildetoleranceest:+/-0,3°C",'').
        Replace("** Les appareils ci-dessous n'ont pas passés le test de calibrage.          **",'§').
        Replace('*','').
        Replace('n°','').
        Replace('Sonde','').
        Replace(' ','').
        Replace('   ','') |
        Set-Content $_
  }


$folders = 'C:\Users\user\Desktop\DEV\2019\2019_01 Janvier'
$files = Get-ChildItem -Path $Folders -Include *.txt -Force -Recurse 
foreach ($File in $Files) {
        Foreach ($FileContent in $File) {
        $FileContent = Get-Content -Path $File
        $date = [regex]::matches($File,'\d{2}-\d{2}-\d{4}').value

         }
        $serial_temp = $FileContent -ireplace "^[^\[]*\[\s*","" -ireplace "\s*\][^\[]*\[\s*","`r`n" -ireplace "\]" 
        $serial = [regex]::Matches($serial_temp, '§([^/)]+)§') |ForEach-Object { $_.Groups[1].Value }
        [System.String]$Text = $serial
$Keys = $serial -ireplace "^[^\[]*\[\s*","" -ireplace "\s*\][^\[]*\[\s*","`r`n" -ireplace "\]" 

    Write-Host $Serial $date    

    }

1 Ответ

0 голосов
/ 15 марта 2019

Теперь, когда вы дали нам пример для работы, я думаю, что это поможет вам.

Код анализирует файл и экспортирует файл CSV с четырьмя столбцами: Serial, Date,Model и четвертый столбец, чтобы показать, прошел ли 'Sonde' калибровочный тест под названием Status.
или не прошел его (вы можете оставить его вне курса, но тогда вы можете подумать, что все оборудование работает нормально ...)

$folders = 'C:\Users\user\Desktop\DEV\2019\2019_01 Janvier'
$files   = Get-ChildItem -Path $folders -Filter '*.txt' -Force -Recurse 
$result  = @()

foreach ($file in $files) {
    # read the file as single string (-Raw) and split into 3 text blocks
    $content = Get-Content -Path $file.FullName -Raw

    # get the date from the file name
    $date = [regex]::Matches($file.Name,'\d{2}-\d{2}-\d{4}').Value
    if (!$date -and $content -match '\d{2}-\d{2}-\d{4}') {
        # if date from file name failed, try and get it from the content
        $date = $matches[0]
    }
    else {
        # if still not date is found, take it from the file itself
        $date = '{0:dd-MM-yyyy}' -f $file.LastWriteTime
    }

    # get the model number at the end of the 'Commentaire' line if any
    $model = if ($content -match 'Commentaire\s*:.*\s(\d+)[\r?\n]') { $matches[1] } else { '' }

    # split the content into text blocks and select the last two
    $content  = $content -split 'Les appareils ci-dessous' | Select-Object -Last 2

    $re = [regex]'\[\s*(?<serial>\w+)'
    foreach ($block in $content) {
        if ($block -match 'Calibrés Et Vérifiés') {
            $match = $re.Match($block)
            while ($match.Success) {
                $result += [PSCustomObject]@{
                    Serial = $match.Groups['serial'].Value
                    Date   = $date
                    Model  = $model
                    Status = 'Passed'
                }
                $match = $match.NextMatch()
            } 
        }
        elseif ($block -match "n'ont pas passés") {
            $match = $re.Match($block)
            while ($match.Success) {
                $result += [PSCustomObject]@{
                    Serial = $match.Groups['serial'].Value
                    Date   = $date
                    Model  = $model
                    Status = 'Failed'
                }
                $match = $match.NextMatch()
            } 
        }
    }
}

$result | Export-Csv "C:\Users\user\DEV\somefile.csv" -Append -NoTypeInformation

Используя ваш файл примера, полученный CSV-файл будет содержать:

"Serial","Date","Model","Status"
"AE190150013","17-01-2019","12199","Passed"
"AE190150014","17-01-2019","12199","Passed"
"AE190150017","17-01-2019","12199","Passed"
"AE190150018","17-01-2019","12199","Passed"
"AE190150015","17-01-2019","12199","Passed"
"AE190150020","17-01-2019","12199","Passed"
"AE190150012","17-01-2019","12199","Passed"
"AE190150016","17-01-2019","12199","Passed"
"AE190150011","17-01-2019","12199","Passed"
"AE190150019","17-01-2019","12199","Passed"
"AE190150001","17-01-2019","12199","Passed"
"AE190150002","17-01-2019","12199","Passed"

Надеюсь, что ответ на ваш вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...