【发布时间】:2015-03-05 15:30:48
【问题描述】:
我正在尝试导入一个 csv 文件,它不会导入在导入行上方声明的数组中列出的任何值。该数组由从数据库中提取的某些值组成,我不想导入 csv 文件中 txnID 列值与数组中的值不匹配的所有行,但是我在尝试循环时遇到问题我的阵列。
我是使用 powershell 的新手,也许我什至没有正确实现数组,但我找不到任何关于 import-csv Filename |Where column -notmatch $array
$Database = 'Database'
$Server = "Server"
$SqlQuery = 'SELECT DISTINCT WebOrderNumber FROM tbOrders
WHERE WebOrderNumber IS NOT NULL AND Len(WebOrderNumber)>8'
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Data Source=Datasource;Initial Catalog=Database;User ID=ID;Password=Pass;Integrated Security=False;"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection
$SqlConnection.Open()
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$Reader = $SqlCmd.ExecuteReader()
while ($Reader.Read()) {
#write-Output($Reader.GetValue($0))
$Key = $Reader.GetValue($0)
$table += $Key
}
foreach ($Row in $table){
write-output($Row)
$CSVFile = (import-csv "C:\Users\Office-Admin\Documents\Complete Sales Orders.csv") |where {$_.txnID -ne $Row} | select txnID, FirstName, LastName, Cust_Name, mc_Shipping, Payment_Gross, address_street, Address_Zip, quantity, item_name, item_number, payer_email, address_city, address_state, address_country, address_name, Shipping_Method, mc_gross
}
$CSVFile | export-csv "C:\Users\Office-Admin\Documents\Sales Order Import List.csv" -notypeinformation
remove-item variable:table
#Send SMTP Message
$SqlConnection.Close()
我已经稍微更新了我的代码,但问题仍然存在。我意识到我现在相信代码,每次循环并导入时,where 中的前一个条件都被遗忘了,所以最后唯一没有导入的值是最后一个 $Row 值,但我需要所有要排除 $table 中的值,我不知道该怎么做。
【问题讨论】:
-
如果您执行
where {$Row -notcontains $_.txnID}会发生什么,但这仅适用于完全匹配。当前,您是字符串,用于将字符串与您知道的不工作的数组匹配。-Contains和-notcontains将单个元素与数组进行比较。我认为你也应该把比较{ $Row -notmatch $_.txnID} -
还是不行。我开始认为这可能与我的 $table 数组结构有关。由于添加了多个值,因此当我写入输出时,$Row 列出了一个长的单行字符串,其中包含所有值,没有分隔符。你看到我如何向 $Table 数组添加值有任何问题吗?
-
我还可以补充一点,我刚刚运行了一个场景,其中 $table 中只有 1 个项目,并且代码做了我想要它做的事情,所以我认为这绝对是我的方式m 向数组添加值
-
现在我相信罪魁祸首是因为我在 $table 中循环遍历 foreach $row,如果我的数组中有 3 个值,它会运行导入 3 次,但会覆盖每次所做的更改,所以从 csv 中取出的唯一值是我数组中的最后一个值
标签: arrays powershell csv