2014-01-27 20 views
0

我使用針對由CSV填充的數組foreach循環。 CSV包含產品名稱行,當前支持狀態以及開始支持時的版本號。有時這些支持版本由於各種原因而逗號分隔。的PowerShell + =上foreach循環是增加重複的實例

當以逗號分隔的版本是在一個行中發現,該行從數組中取出。然後創建一個新行並將其添加到數組中,以找到每個版本。

我遇到的問題是,如果我有一個版本的「7,8,9」我結束了三排所有上市版本9.故障排除腳本表明值被拆分並正確回升,但該陣列似乎正在更新每個值與最新的。例如,第一次通過會使版本7,第二次通過v8的兩個實例,最後一次通過與v9 3次。

如何讓我的+ =運算符不更新現有的行?

 
    foreach ($line in $sheet) 
    { 
    if ($line.'Support Started' -cmatch ",") 
     { 
     $sheet = $sheet -ne $line 
     $line.'Support Started'.Split(",") | 
       ForEach 
       { 
       $subver = $_ 
       $line.'Support Started' = $subver 
       $sheet = $sheet += ($line) 
       } 
     } 
    } 

爲了提供更多的信息,如果我使用以下命令:

 
    write-host $line 
    $sheet += $line 
    write-host $line 

與7,8,9文件的版本,我得到下面的輸出:

產品1,支持7
產品1,支持,7
產品1,支持,8
產品1,支持,8
產品1,支持,9
產品1,支持,9

當檢查$表的價值,我得到:

產品1,支持,9
產品1,支持,9
產品1,支持,9

+0

你能舉一個你的輸入的例子,你到底想做什麼? – Bill

+0

輸入是按以下格式: '「產品」,「狀態」,「支持開始」 「產品1」,「支持」,「7,8,9」' 然後我使用get-內容放在數組中,然後是foreach循環。我想在循環之後進行以下操作: '「product」,「status」,「support started」 「Product1」,「supported」,「7」 「Product1」,「supported」,「8」 「Product1 「,」支持「,」9「 我對此評論的格式表示歉意。我已經編輯了大約30次,但換行符仍然不起作用。 – Steve

+0

將其編輯到您的文章中。將它置於註釋中會破壞格式。 – alroc

回答

1

你確定你沒有閱讀使用進口-CSV文件?

您有問題的原因是,當你做

foreach ($line in $sheet) 
... 

那麼變量$行是不是在$錶行的副本,但在表變量線的基準。即當你改變$行時,你實際上正在改變$ sheet。

我會盡量不要在操作數據時更改$ sheet,而是創建一個可以容納所有數據的新數組。這樣的事情:

$sheet = Import-Csv data.csv 

$newsheet = @() 
foreach ($line in $sheet) 
{ 
    if ($line.'Support Started' -cmatch ",") 
    { 
     $a = $line.'Support Started'.Split(",") 
     ForEach ($subver in $a) 
     { 
      $line2 = $line.PSObject.Copy() 
      $line2.'Support Started' = $subver 
      $newsheet += $line2 
     } 
    } else { 
     $newsheet += $line 
    } 
} 
+0

這正是我在填寫$ sheet時所做的。我不知道數據處理會如此不同。我仍然困惑,爲什麼要添加新行,然後舊行更新,但我很樂意讓它工作。非常感謝! – Steve

0

你線

$sheet = $sheet += ($line) 

應改爲(編輯)

$sheet += @{'product'=$line.product; 'status'=$line.status; 'support started'=$_} 

PS變得略微迷茫的時候$線是$表,通過使一個新的對象

+0

輸出結果是一樣的 – Steve

0

$sheet = $sheet += ($line)

$sheet += $line補救已經追加到$line$sheet。額外的分配操作可能會導致您的問題。

+0

我還在重複行 – Steve

0

未測試:

$sheet = 
foreach ($line in $sheet) 
{ 
    if ($line.'Support Started' -cmatch ",") 
    { 
     $line.'Support Started'.Split(",") | 
      ForEach 
      { 
      $subver = $_ 
      $line.'Support Started' = $subver 
      $line 
      } 
    } 
    else {$line} 
} 
+0

這仍然是吐出與以前相同的輸出。我在添加行到表單之前和之後完成了寫入主機$行,並且該值始終正確寫入(7,然後是8,然後是9),但表單中包含每次最後一個版本號的重複行。 – Steve

+0

在代碼塊中發佈示例文件數據。 – mjolinor