Экспорт результатов (2) командлетов в отдельные столбцы в одном CSV - PullRequest
0 голосов
/ 21 сентября 2018

Я новичок в PS, поэтому ваше терпение ценится.

Я пытаюсь получить данные из (2) отдельных файлов CSV и затем сбросить их в новый CSV с (2) столбцами.Сделать это для (1) легко, но я не знаю, как сделать это для большего.

Это прекрасно работает:

Import-CSV C: \ File1.csv |Выберите «Сотрудник» |Export-CSV -Path D: \ Result.csv -NoTypeInformation

Если я добавлю еще один Import-CSV, он просто перезапишет существующие данные:

Import-CSV C: \ File2.csv|Выберите «Отдел» |Export-CSV -Path D: \ Result.csv -NoTypeInformation

Как я могу получить столбцы A и B, заполненные результатом информации из этих двух команд?Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Я бы выбрал эту опцию:

$1 = Import-Csv -Path "C:\Users\user\Desktop\1.csv" | Select "Employee" 
$2 = Import-Csv -Path "C:\Users\user\Desktop\2.csv" | Select "Department" 
$marged = [pscustomobject]@()
$object = [pscustomobject]
for ($i=0 ; $i -lt $1.Count ; $i++){
    $object = [pscustomobject]@{
    Employees = $1[$i].Employee
    Department = $2[$i].Department}
    $marged += $object
}
$marged | ForEach-Object{ [pscustomobject]$_  } | Export-Csv -Path "C:\Users\user\Desktop\3.csv" -NoTypeInformation -Force
0 голосов
/ 21 сентября 2018

Я объясню, как я это сделаю, но я делаю это так, потому что мне удобнее работать с объектами, чем с хаст-таблицами.Кто-то может предложить ответ, используя хеш-таблицы, которые, вероятно, будут работать лучше.

Сначала я бы определил массив для хранения ваших данных, который позже можно будет экспортировать в CSV:

$report = @()

ЗатемЯ бы импортировал ваш CSV в объект, который может быть повторен:

$firstSet = Import-CSV .\File1.csv

Затем я бы повторил это, импортируя каждую строку в объект, который имеет два свойства, которые я хочу.В вашем случае это Employee и Department (потенциально больше, которые вы можете легко добавить).

foreach($row in $firstSet)
{
   $employeeName = $row.Employee
   $employee = [PSCustomObject]@{
      Employee = $employee
      Department = ""
   }

   $report += $employee
}

И, как вы можете видеть в приведенном выше примере, добавьте этот объект в ваш отчет.

Затем импортируйте второй CSV-файл во второй объект, чтобы выполнить его итерацию (для хорошей формы я фактически сделал бы это в начале скрипта, когда вы импортируете свой первый):

$secondSet = Import-CSV .\File2.csv

Теперь здесьгде это становится интересным.Исходя из предоставленной вами информации, я предполагаю, что все сотрудники в одном файле расположены в том же порядке, что и отделы в других файлах.Так, например, если я работаю в «Департаменте дегустации тортов», и мое имя указано в строке 12 файла 1, в строке 12 файла 2 указано «Департамент дегустации тортов».

В этом случае это довольно просто.,Вы просто прокрутите оба списка и обновите отчет:

$i = 0

foreach($row in $secondSet)
{
   $dept = $row.Department
   $report[i].Department = $dept

   $i++
}

После этого ваш объект $report будет содержать всех ваших сотрудников в одной строке и отделов в другой.Затем вы можете экспортировать его в CSV:

$report | Export-CSV .\Result.csv -NoTypeInformation

Это работает, если, как я уже сказал, ваши данные выровнены по обоим файлам.Если нет, то вам нужно немного подумать:

foreach($row in $secondSet)
{
   $emp = $row.Employee
   $dept = $row.Department
   $report | Where {$_.Employee -eq $emp} foreach {$_.Department = $dept
}

Технически, в любом случае, вы можете просто сделать это таким образом, но это зависит от многих вещей.Прежде всего, если у вас есть данные для сопоставления в этом столбце по обоим файлам (что, очевидно, в моем примере вы не делаете, в противном случае вам не нужно было бы делать это в первую очередь, но вы можете сопоставить по другим полям, которые могуткак EmployeeID или DoB).Во-вторых, в отношении суверенитета отдельных записей (например, если у вас есть несколько совпадающих записей в вашем первом файле, у вас возникнет проблема; вы ожидаете дублирования во втором, поскольку в каждом отделе более одного человека).

В любом случае, надеюсь, это поможет.Как я уже сказал, вероятно, есть «лучший» способ сделать это, но я бы так и сделал.

...