【问题标题】:Import-CSV Where -notmatch list of array valuesImport-CSV Where -notmatch 数组值列表
【发布时间】: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


【解决方案1】:

这应该可以工作。主要问题是您在每个循环中都过度编写 csv。

$table = import-csv file1.csv | % {$_ID} #gets array of just the ID values
$CSVFile = Import-csv file2.csv  | where{$table -notcontains $_.ID} | export-csv output.csv -notypeinformation

为了向您展示这是如何工作的,我以创建文件为例:

File 1: CSV with IDs:
ID,Stuff
123,alittlestuff
234,morestuff
345,evenmore
456,alotmore
567,somemore
678,notsomuch
789,tonesofstuff


File 2: csv with ID and stuff:
ID,stuff
123,hello
ghf,world
234,test
lkj,this

运行代码后,唯一得到输出的行是:

ID,Stuff
ghf,world
lkj,this

所以我认为将其放入您的代码中,请使用:

$filter = $table | %{$_.txnID}
$CSVFile = (import-csv "C:\Users\Office-Admin\Documents\Complete Sales Orders.csv") | where{$filter -notcontains $_.txnID} || export-csv "C:\Users\Office-Admin\Documents\Sales Order Import List.csv" -notypeinformation

【讨论】:

  • 我认为这肯定更接近,但是 import-csv 是否也在循环内被覆盖?前任。如果第一行值 = 5 并且第一次导入将排除 csv 中列为 5 的行。但是第二行的值为 2,则代码将通过并导入除其中行之外的所有行相应的列 = 2。但是第二次通过,这似乎覆盖了先前的导入并第二次包含 5 但不包含 2。我想要它以便完全排除 $Table 中的所有 $Row,这样 5 或 2 都不会在新的 csv 中
  • 无论如何我可以在 where 条件中包含像where {$_.txnID -ne $table[0..($table.length)] 这样的数组范围,因为最大的问题也是数组大小是动态的,数组将包含的值也是动态的
  • 不要在每个循环中导入 csv 将其导入到循环外的变量中,然后在循环内使用它,请参阅上面的编辑。
  • 稍等一下,我添加了更多测试数据,但它不起作用让我玩弄它并尝试修复它。
  • 好的,感谢您的帮助。我会继续搞砸,看看能不能找到解决办法
猜你喜欢
  • 2012-06-20
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2019-06-14
  • 2013-02-08
相关资源
最近更新 更多