Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Выборочное копирование по значению в txt (csv) файлах (http://forum.oszone.net/showthread.php?t=348930)

Technik_spat 04-06-2021 14:14 2959511

Выборочное копирование по значению в txt (csv) файлах
 
Вложений: 3
Уважаемые профессионалы, обращаюсь к Вам за помощью.
Есть, формируемые ежедневно, несколько текстовых файлов (по факту можно сказать csv), в которых идут необходимые данные, каждый день (а иногда и по несколько раз в день) я их обрабатываю через Excell, но это не всегда проходит, иногда приходиться файлы буквально разделять. В самом экселе я обработываю через функцию ВПР, честно скажу иногда мозг взрывается(((((
Сама задача состоит в том, что мне необходимы всего два значения: Schtrih и Result
1. В файле Файл 164670 в первой колонке самые нужные значения, но их надо отсеивать по значению в третей колонке (т.е. или по 11-ому или 14-ому).
2. В файле Файл 164669 по отсеянным значениям Schtrih из одноименного файла, необходимо изъять значения Aspect
3. В файле Файл 164671 по ранее отсеянным значениям Aspect подобрать значения Result и прикрепить их со значениями Schtrih, ранее отсеянными.

Самый наверное странный от меня ещё вопрос: а это возможно как сделать, к примеру, в CMD/BAT-с ним я поверхностно знаком и в случае каких-либо изменений от сборщиков (а они любят менять файлы), что бы я мог изменить название или номер столбца?
Файл 164669; Файл 164670; Файл 164671

Elven 04-06-2021 17:30 2959514

Если я правильно понял что нужно:
Код:

$Schtrihs = Import-Csv ./Schtrih.txt -Delimiter ";" | Where-Object {($_.Type -eq 11 ) -or ($_.Type -eq 14)}
$Aspects = Import-Csv ./Aspect.txt -Delimiter ";"
$warks = Import-Csv ./wark.txt -Delimiter ";"

foreach ($Schtrih in $Schtrihs) {
  foreach ($Aspect in $Aspects) {
    foreach ($wark in $warks) {
      if (($Schtrih.Schtrih -eq $Aspect.Schtrih) -and ($Aspect.Aspect -eq $wark.Aspect)) {
        [pscustomobject]@{
          "Schtrih"      = $Schtrih.Schtrih
          "Aspect"        = $Aspect.Aspect
          "Result"        = $wark.Result
        }
      }
    }
  }
}

решение на пошике, но перебирать нормально csv на cmd кмк нереально. так что лучше смотреть в сторону чего-то более продвинутого.
сохранить как ps1, запускать, соответсвенно, через powershell.

Technik_spat 05-06-2021 08:52 2959532

СПАСИБО))))
А как можно это сохранять и в столбцах, а то в самом окне PowerShell это выводится одним столбиком и приходится сохранять копированием.
Я вот тут сам что то пытался со своей колокольни доделать, но выходит криво, постоянно ругается:
Out-File : Не удается найти позиционный параметр, принимающий аргумент "Get-Process".
C:\Test_stgin\Farm\на оборот\convert.ps1:4 знак:9
+ Out-File <<<< -Encoding "UTF8" = Get-Process powershell >>./proc.txt -Value
+ CategoryInfo : InvalidArgument: (:) [Out-File], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.OutFileCommand


Сам код, который я пытался перенаправить:
Код:

$Schtrihs = Import-Csv ./Schtrih.txt -Delimiter ";" | Where-Object {($_.Type -eq 11 ) -or ($_.Type -eq 14)}
$Aspects = Import-Csv ./Aspect.txt -Delimiter ";"
$warks = Import-Csv ./wark.txt -Delimiter ";"
Out-File -Encoding "UTF8" = Get-Process powershell >>./proc.txt  -Value

foreach ($Schtrih in $Schtrihs) {
  foreach ($Aspect in $Aspects) {
    foreach ($wark in $warks) {
      if (($Schtrih.Schtrih -eq $Aspect.Schtrih) -and ($Aspect.Aspect -eq $wark.Aspect)) {
        [pscustomobject]@{
          "Schtrih"      = $Schtrih.Schtrih
          "Aspect"        = $Aspect.Aspect
          "Result"        = $wark.Result

        }
      }
    }
  }
}


Elven 05-06-2021 10:05 2959534

как-то сложно. можно скинуть всё в переменную и из нее уже как удобнее будет.

Код:

$Schtrihs = Import-Csv ./Schtrih.txt -Delimiter ";" | Where-Object {($_.Type -eq 11 ) -or ($_.Type -eq 14)}
$Aspects = Import-Csv ./Aspect.txt -Delimiter ";"
$warks = Import-Csv ./wark.txt -Delimiter ";"

$res = foreach ($Schtrih in $Schtrihs) {
        foreach ($Aspect in $Aspects) {
          foreach ($wark in $warks) {
            if (($Schtrih.Schtrih -eq $Aspect.Schtrih) -and ($Aspect.Aspect -eq $wark.Aspect)) {
              [pscustomobject]@{
                "Schtrih"      = $Schtrih.Schtrih
                "Aspect"        = $Aspect.Aspect
                "Result"        = $wark.Result
              }
            }
          }
        }
      }
$res | Out-File res.txt
$res | Export-Csv -Delimiter ";" -Path res.csv


Technik_spat 05-06-2021 11:27 2959539

СПАСИБО ОГРОМНОЕ))))


Время: 13:40.

Время: 13:40.
© OSzone.net 2001-