【问题标题】:Search CSV using values from CSV使用 CSV 中的值搜索 CSV
【发布时间】:2022-01-07 21:14:04
【问题描述】:

我有一个包含两列计算机和一个操作的 CSV 我还有另一个包含 3 列计算机标识符序列号和设备 ID 的 CSV。

我想获取 CSV1 并获取计算机列并在 CSV2 中搜索这些值,看看它是计算机标识符还是序列号,然后给我匹配的设备 ID,以便我可以针对它运行另一个函数。

所以 CSV 1

Computer Action
CB12345 Lock
574638 Unlock

将搜索计算机值在 CSV 2 中的位置

DeviceID CB Number Serial
57687348 CB12345 674Z2X3
34554345 CB65487 474Z2X3
54868323 CB45789 574Z2X3
15593235 CB65976 974Z2X3
37593236 CB35466 074Z2X3

一旦它找到值是 CB 编号还是序列号,它将获取其对应的设备 ID,以便我可以在另一个函数中使用它。

这是我目前所拥有的,但我不知道该怎么做,所以我可以同时使用这两个 CSV

$yesterday = [datetime]::Today.AddDays(-1).tostring("yyyy-MM-dd")
$date = get-date -Format yyyy-MM-dd
$CB = import-csv -Path "\\Scripts\GAM test\CBs" 
$GAM = import-csv -Path "\\Scripts\GAM\CSV\$yesterday-GAMprintCROSbasic.csv"

```  
<# foreach ($record in $CB)
    {
    if ($record.action = "Unlock")
        {
        $DeviceID = $record.deviceID
        $DeviceAsset = $record.asset

        E:\gam\gam.exe update cros $DeviceID action enable
            Write-Output "$deviceID is being disabled. $deviceasset"
        Start-Sleep 10 #>

【问题讨论】:

  • edit 分享您的问题minimal reproducible example
  • if ($record.action = "Unlock") 在 PowerShell 中必须是 if ($record.action -eq "Unlock")
  • 如果可以的话,我会考虑使用可以在 CSV1 和 CSV2 之间进行连接的工具,并在 CSV3 结果上运行 shell 脚本;否则每次运行时,您的脚本都需要将 CSV2 加载到 ram 中,如果 CSV2 很大,那么在自动化 CSV1 文件的高周转率方面可能会变得耗时且昂贵

标签: powershell csv google-admin-sdk


【解决方案1】:

如果您想使用当前计算机记录从第二个 CSV 中查找匹配的 CB NumberSerial,您可以为此使用 where 语句。

这是一个精简的例子来证明这一点。

# CSV #1 - Computer / Action
$CB = import-csv -Path "\\Scripts\GAM test\CBs" 
# CSV #2 - DeviceID / CB Number /Serial
$GAM = import-csv -Path "\\Scripts\GAM\CSV\$yesterday-GAMprintCROSbasic.csv"

foreach ($record in $CB) {
    if ($record.action -eq "Unlock") {
        # Select  matching value 
        $GamRecord = $Gam | Where { $_.'CB Number' -eq $Record.Computer -or $_.'Serial' -eq $Record.Computer } | Select -First 1
        if ($null -eq $GamRecord) {
            Write-Warning "No match for: $($record.Computer)"
            Continue
        }

        $Serial = $GamRecord.Serial    


 
        # $GamRecord.'CB NUmber'
        # $GamRecord.DeviceID

    }

}

一旦您拥有$GamRecord,这是与$Record.Computer 相关的第一条记录,无论是在其CB 编号 还是Serial 中,您都可以访问所有属性通过各自的变量从两个 CSVS 获取。

$record.Computer # Is a match to either $GamRecord.'CB Number' or $GamRecord.Serial
$record.Action
$GamRecord.'CB Number'
$GamRecord.DeviceId
$GamRecord.Serial

请注意,我留下了 if ($null -eq $GamRecord) {,因为如果第一个 CSV 中的 计算机 不对应于任何 CB 编号 或 串行。

还要注意在 if 语句中进行比较时使用-eq。 正如其中一位评论者所指出的,在您的初始示例中,您使用了if ($record.action = "Unlock"),这是不正确的。 = 仅用于给变量赋值,不用作比较运算符。对于后者,使用-eq

【讨论】:

    猜你喜欢
    • 2017-12-18
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多