我是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结果正确排列感到困惑。任何帮助将不胜感激。
答案 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()