将(2)cmdlet的结果导出到同一CSV中的单独列

时间:2018-09-21 00:59:02

标签: powershell powershell-v3.0 powershell-v4.0

我是PS新手,感谢您的耐心等候。

我正在尝试从(2)个单独的CSV文件中获取数据,然后将它们转储到具有(2)列的新CSV中。对于(1)这样做很容易,但是我不知道该怎么做。

这很完美:

导入CSV C:\ File1.csv |选择“员工” |导出CSV-路径D:\ Result.csv -NoTypeInformation

如果我添加另一个Import-CSV,那么它只会覆盖现有数据:

导入CSV C:\ File2.csv |选择“部门” |导出CSV-路径D:\ Result.csv -NoTypeInformation

如何用这两个命令的信息结果填充A和B列?感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我会选择此选项:

$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

答案 1 :(得分:0)

我将说明我将如何执行此操作,但我这样做是因为与使用hastables相比,使用对象更自如。其他人可能会使用哈希表提供答案,这可能会更好。

首先,我将定义一个数组来保存您的数据,然后可以将其导出为CSV:

$report = @()

然后,我将CSV导入到可以通过以下方式迭代的对象:

$firstSet = Import-CSV .\File1.csv

然后,我将遍历此过程,将每一行导入到具有我想要的两个属性的对象中。在您的情况下,这些是“员工”和“部门”(可能可以轻松添加更多)。

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

   $report += $employee
}

并且,如您在上面的示例中看到的那样,将此对象添加到报表中。

然后,将第二个CSV文件导入到另一个对象中以进行迭代(以良好的形式,实际上,在导入第一个CSV文件时,我会在脚本开头执行此操作):

$secondSet = Import-CSV .\File2.csv

现在这是有趣的地方。仅根据您提供的信息,我假设一个文件中的所有员工与其他文件中的部门的顺序相同。例如,如果我在“蛋糕品尝部”工作,而我的名字在文件1的第12行上,则文件2的第12行显示“蛋糕品尝部”。

在这种情况下,这很容易。您只需浏览两个列表并更新报告:

$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)。其次,关于个人记录的主权(例如,如果您的第一个文件中有多个匹配记录,那么您会遇到问题;您会期望第二个文件中有重复的记录,因为每个部门中都有多个人)。

无论如何,我希望这会有所帮助。正如我说的那样,可能有一种“更好”的方式来做到这一点,但这就是我的方式。