使用Powershell将查询结果添加到现有的csv

时间:2018-07-23 20:38:25

标签: powershell

我是PowerShell的新手。我正在尝试自动将学生考试成绩导入我们的学生管理系统。我们会收到一个包含多个用户测试数据的csv文件。我需要将csv文件中的学生ID转换为系统使用的学生ID。学生可以多次参加考试。该示例文件不包含我在尝试查找解决方案时添加的IntID字段。

示例CSV文件:

ID, Test, Score, Date, IntID
1234, 51, 90, 6/20/2018
1234, 51, 92, 7/15/2018
2345, 67, 95, 7/18/2018
3456, 77, 84, 7/10/2018

到目前为止我所拥有的:

add-type -path "D:\app\oracle\client\ODP.NET\bin\2.x\oracle.dataaccess.dll"
$con = new-object oracle.dataaccess.client.oracleconnection("user id=user;password=xxxxx;data source=proddb")
$con.open()

$file = import-csv D:\TestLoad\scores.csv
$file.ID | foreach-object {
$cmd = $con.CreateCommand()
$cmd.CommandText = "select user_id from user where user_ssn = '" + $_ + "' "

$rdr = $cmd.ExecuteReader()
if ($rdr.Read()) {
    $rdr.GetDecimal(0) | select *,@{Name='IntID';Expression={$rdr.GetDecimal(0)}} | export-csv D:\TestLoad\scores.csv -notypeinformation -append -force
}
}
$con.Close()

我的结果:

ID, Test, Score, Date, IntID
1234, 51, 90, 6/20/2018
1234, 51, 92, 7/15/2018
2345, 67, 95, 7/18/2018
3456, 77, 84, 7/10/2018
,,,,"73711"
,,,,"73711"
,,,,"96255"
,,,,"41201"

我感觉自己缺少一些简单的东西,但是目前我对如何使我的IntID结果正确排列感到困惑。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

将IntId标头从源文件中取出,只有在下面的行没有该列的逗号并且内容不匹配时,才有可能混淆Import-Csv。

$file.ID | foreach-object {单独遍历ID会丢失所有原始列数据。您稍后尝试使用select *,...再次选择它,但是尝试提供$rdr.GetDecimal(0) | select-object,并且getDecimal()的输出没有任何原始CSV数据供select使用。

PowerShell中的CSV处理非常有根据,您需要的流程是:

导入Csv->管道中的对象->向具有IntId名称/值的每个对象添加新属性->导出到 new csv,或覆盖(但不-append ing)新行。

我认为类似的方法会起作用:

Add-Type -path "D:\app\oracle\client\ODP.NET\bin\2.x\oracle.dataaccess.dll"

$con = new-object oracle.dataaccess.client.oracleconnection("user id=user;password=xxxxx;data source=proddb")
$con.open()

import-csv D:\TestLoad\scores.csv | foreach-object {

    $cmd = $con.CreateCommand()
    $cmd.CommandText = "select user_id from user where user_ssn = '" + $_.Id + "' "

    $rdr = $cmd.ExecuteReader()

    if ($rdr.Read())
    {

        # $_ being an object representing the current line of the CSV
        $_ | Add-Member -NotePropertyName 'IntId' -NotePropertyValue $rdr.GetDecimal(0) -PassThru
    }
} | Export-Csv D:\TestLoad\scores2.csv -notypeinformation -append -force

$con.Close()