Войти

Показать полную графическую версию : Выборочное копирование по значению в txt (csv) файлах


Technik_spat
04-06-2021, 14:14
Уважаемые профессионалы, обращаюсь к Вам за помощью.
Есть, формируемые ежедневно, несколько текстовых файлов (по факту можно сказать 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
Если я правильно понял что нужно:
$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
СПАСИБО))))
А как можно это сохранять и в столбцах, а то в самом окне 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
как-то сложно. можно скинуть всё в переменную и из нее уже как удобнее будет.

$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
СПАСИБО ОГРОМНОЕ))))




© OSzone.net 2001-2012