使用来自Another的信息编辑一个.CSV

时间:2017-03-14 17:36:48

标签: powershell csv

我有两个.csv文件,一个包含员工ID列表和一个部门识别号,另一个包含注册到他们的所有设备的列表。这两个文件共享员工ID字段,我想从第一个文件中取出部门编号,并将其添加到第二个文件中相应员工设备的每个部分(或者可能输出第三个文件如果这是最方便的方法,则加入信息)。到目前为止,我已经从第一个文件中提取了我需要的信息,并将其存储在哈希表中,我相信我应该可以将其用于与其他文件进行比较,但我不确定如何去关于那个。我在网站上发现的其他可能相关的问题似乎只是检查两个文件之间的重复/更改。任何帮助将非常感激。以下是我创建哈希表的代码:

Import-Csv "filepath\filename.csv"|ForEach-Object -Begin{
    $ids = @{}
} -Process {
    $ids.Add($_.UserID,$_.'Cost Center')}

编辑:

以下是数据样本:

第一个CSV:

UserID | Legal Name | Department
---------------------------------
XXX123| Namey Mcnamera | 1234

XXX321| Chet Manley | 4321

XXX000| Ron Burgundy | 9999

第二个CSV:

Barcode | User ID | Department
--------------------------------

000000000000 | xxx123 | 0000
111111111111 | xxx123 | 0000
222222222222 | xxx123 | 0000
333333333333 | xxx321 | 0000
444444444444 | xxx321 | 0000
555555555555 | xxx000 | 0000

第二个csv还有几列数据,但这三个是我唯一关心的。

编辑2:

使用@wOxxOm中的代码(编辑为添加-force参数,因为当条目已存在时尝试写入部门列时收到错误):

$csv1 = Import-Csv "filename.csv"
$csv2 = Import-CSV "filename.csv"

$indexKey = 'UserID'
$index1 = @{}; foreach($row in $csv1){$index1[$row.$indexKey] = $row.'department'}

$copyfield = 'department'
foreach($row in $csv2){
    if ($matched = $index1[$row.'User ID']){
        Add-Member @{$copyField = $matched.$copyfield} -InputObject $row -Force
     }
}

export-csv 'filepath.csv' -NoTypeInformation -Encoding UTF8 -InputObject $csv2 -Force

输出以下信息:

Count   Length  LongLength  Rank    SyncRoot    IsReadOnly  IsFixedSize IsSynchronized
48  48  48  1   System.Object[] FALSE   TRUE    FALSE

编辑3:

在@Ross Lyons的帮助下完成了一切。工作代码如下:

#First Spreadsheet
$users = Import-Csv "filepath.csv" 

#Asset Listing
$assets = Import-Csv "filepath.csv" 

[System.Array]$data = ""

#iterating through each row in first spreadsheet
foreach ($user in $users) {
      #iterating through each row in the second spreadsheet
      foreach ($asset in $assets) {
        #compare user ID's in each spreadsheet
        if ($user.UserID -eq $asset.'User ID'){
            #if it matches up, copy the department data, user ID and barcode from appropriate spreadsheets
            $data += $user.UserID + "," + $user."Department" + "," + $asset."Barcode" + ","
            }
        }

}
$data | Format-Table | Out-File "exportedData.csv" -encoding ascii -Force

2 个答案:

答案 0 :(得分:1)

哈希表键应该是公共字段,其值应该是您可以稍后以$hashtable[$key]方式访问的整行:

$csv1 = Import-Csv 'r:\1.csv'
$csv2 = Import-Csv 'r:\2.csv'

# build the index    
$indexKey = 'employee ID'
$index1 = @{}; foreach ($row in $csv1) { $index1[$row.$indexKey] = $row }

# use the index
$copyField = 'department number'
foreach ($row in $csv2) {
    if ($matched = $index1[$row.$indexKey]) {
        Add-Member @{$copyField = $matched.$copyField} -InputObject $row
    }
}

Export-Csv 'r:\merged.csv' -NoTypeInformation -Encoding UTF8 -InputObject $csv2

代码不使用管道进行整体加速。

答案 1 :(得分:1)

好的,首先,请温柔,我还在学习自己!让我知道以下是否有效,或者有什么明显错误......

#this is your first spreadhseet with usernames & department numbers
$users = Import-Csv "spreadsheet1.csv"

#this is your second spreadsheet with equipment info & user ID's, but no department numbers
$assets = Import-Csv "spreadsheet2.csv"

#set a variable for your export data to null, so we can use it later
$export = ""

#iterating through each row in first spreadsheet
foreach ($user in $users) {
      #iterating through each row in the second spreadsheet
      foreach ($asset in $assets) {
        #compare user ID's in each spreadsheet
        if ($user.UserID -like $asset.'User ID')
            #if it matches up, copy the department data, user ID and barcode from appropriate spreadsheets
            $data = "$user.UserID" + "," + "$user.Department" + "," + "$asset.barcode" + "," + "~"

            #splits the data based on the "~" that we stuck in at the end of the string
            $export = $data -split "~" | Out-File "exportedData.csv" -Encoding ascii
            }

}

让我知道你的想法。是的,我知道这可能不是最好或最有效的方法,但我认为它可以完成工作。

如果这不起作用,请告诉我,我还有另外一个问题。