Обработка данных из файлов - PullRequest
0 голосов
/ 25 сентября 2019

Я работаю с данными, импортированными из CSV-файлов, в которых одна и та же информация отображается в другом месте.Я пытаюсь сгруппировать одну и ту же информацию, чтобы избежать построчной обработки файла, но я пока не нашел, возможно ли использовать команду group-object для уже сгруппированного набора данных.

Я быхотелось бы иметь возможность изолировать каждую уникальную «компанию» и «IdComp», затем каждый уникальный контракт и, наконец, иметь возможность читать каждый код и выполнять действия с каждым кодом и генерировать XML-файл в качестве вывода.У меня есть выделенная структура данных для примера, и XML не упоминается.Однако в качестве вывода на консоль я хотел бы иметь возможность получить следующую структуру

Company(ie : AZ Corp)
===> Contract (ie : 555)
========> Code (ie : ZA)
========> Code (ie : TX)
...(next company)

Мой тестовый код

$csv = import-csv “input.txt” –delimiter ';'
$comp = $csv | Group-Object -Property "company" 

ForEach($company in $comp) {
  Write-Output $company.Name

  ForEach($cont in $company) { 
    Write-Output $cont.Group.contract
  }
}

Мой пример XML выглядит так:

company;idcomp;contract;code
AZ corp;100;555;ZA
AZ corp;100;555;TX
AZ corp;100;567;GT
AZ corp;100;567;HY
AZ corp;100;567;KL
WX corp;109;555;TX
WX corp;109;555;JU
WX corp;109;678;HG

Редактировать: мне наконец удалось сделать это с помощью этого кода:

$csv = import-csv “input.txt” –delimiter ';'
$comp = $csv | Group-Object -Property "company" 

ForEach($company in $comp) {
  Write-Host $company.Name

  ForEach($cont in $company) { 
    $contracts = $cont.Group | Group-Object -Property "contract"
    ForEach($contract in $contracts) {
        Write-Host $contract.Name

        ForEach($codedetail in $contract.Group) {
            Write-Host $codedetail.code
        } 
    }
  }
}

Вывод:

AZ corp
555
ZA
TX
567
GT
HY
KL
WX corp
555
TX
JU
678
HG

Я не уверен, является ли это эффективным / более чистым способом сделатьЭто.Любой совет будет приветствоваться.

1 Ответ

0 голосов
/ 25 сентября 2019

Добро пожаловать в Stackoverflow!Если вы указали более одного свойства, Group-Object сначала группирует их по значениям первого свойства, а затем в рамках каждой группы свойств группирует по значению следующего свойства. "

Исходя из этого, если вы используете следующий код:

    $csv | Group-Object -Property "company","contract"

Это даст вам следующий вывод:

Count Name                      Group
----- ----                      -----
    2 AZ corp, 555              {@{company=AZ corp; idcomp=100; contract=555; code=ZA}, @{company=AZ corp; idcomp=10...
    3 AZ corp, 567              {@{company=AZ corp; idcomp=100; contract=567; code=GT}, @{company=AZ corp; idcomp=10...
    2 WX corp, 555              {@{company=WX corp; idcomp=109; contract=555; code=TX}, @{company=WX corp; idcomp=10...
    1 WX corp, 678              {@{company=WX corp; idcomp=109; contract=678; code=HG}}

Затем просто немного измените ваш ForEach на:

ForEach($company in $comp) {
  Write-Output $company.Name

  ForEach($cont in $company) { 
    Write-Output $cont.Group.code
  }
}

Выход

AZ corp, 555
ZA
TX
AZ corp, 567
GT
HY
KL
WX corp, 555
TX
JU
WX corp, 678
HG
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...