【问题标题】:PowerShell += on foreach loop duplicates previously added dataPowerShell += on foreach 循环重复先前添加的数据
【发布时间】:2022-07-06 03:54:28
【问题描述】:

所以我有一个这样的 excel 文件

单据编号、数量、价格

1111-01,1,3.00

1112-00A,2,4.00

我正在做的是将它逐行导入到 powershell 中。 如果数量大于 1,我必须多次复制该行,每次将数量更改为 1 并更新文档编号,使其在每一行上都是唯一的。然后我添加到一个数组中,这样我就可以在最后导出为一个 excel 文件。

$report = Import-Excel "pathToFile.xlsx"
$report2 = @()
foreach($line in $report){
    $report2+=$line.PSObject.Copy()
}
$template = @()
foreach($line in $report2)
...
some irrelevant code
...
if($line.Qty -gt 1){
            $line2 = $line.PSObject.Copy()
            $ogInvoice = $line2.'Document Number'.Split("-")[0]
            $invoiceAfter = $line2.'Document Number'.Split("-")[1]
            if($invoiceAfter -match "^*[A-Z]$"){
                $letter = $invoiceAfter.Substring($invoiceAfter.Length-1,1)
                
            }else{
                $letter = ""
            }
            $qty = $line2.Qty
            $line2.Qty = 1
            $counterQty = 0
            while($counterQty -lt $qty){
                
                $invoiceLastTwoNumber = [int]('{0:d2}' -f[int] $invoiceAfter.Substring(0,2)) + $counter
                $line2.'Document Number' = (-join($ogInvoice,"-",$invoiceLastTwoNumber.ToString(),$letter))
                $counter = $counter + 1
                $template+=$line2
                $counterQty = $counterQty + 1
            }
}

问题是检查进度后,我第一次添加行时,文档编号应该是1112-50A,然后我下次将行添加到$template中,文档编号是1112- 51A 但它更新了先前添加的行。 所以我得到了

1111-01,1,3.00

1112-51A,1,4.00

1112-51A,1,4.00

而不是我想要的是:

1111-01,1,3.00

1112-50A,1,4.00

1112-51A,1,4.00

注意:像 PSObject.Copy 这样的额外编码是我在网上找到的其他东西,因为显然迭代 $report 更像是一个指针。

【问题讨论】:

    标签: excel powershell export-to-excel


    【解决方案1】:

    对于您要完成的工作,代码似乎过于复杂,如果我理解正确,您希望仅在 时重复当前对象 .Qty 一样多次.Qty 大于 1,此外,将 属性值更新为 1

    抛开您当前向我们展示的额外代码,只关注所提出的问题,您可以通过以下方式完成它,使用 $csv 作为源数据示例。

    $csv = @'
    Document Number,Qty,Price
    1111-01,1,3.00
    1112-00A,2,4.00
    1113-00A,4,5.00
    '@ | ConvertFrom-Csv
    
    $output = foreach($line in $csv) {
        if($line.Qty -gt 1) {
            $loopCount = $line.Qty
            $line.Qty  = 1
            for($i = 0; $i -lt $loopCount; $i++) {
                $line
            }
            continue
        }
        $line
    }
    

    示例 $csv 的预期输出为:

    Document Number Qty Price
    --------------- --- -----
    1111-01         1   3.00
    1112-00A        1   4.00
    1112-00A        1   4.00
    1113-00A        1   5.00
    1113-00A        1   5.00
    1113-00A        1   5.00
    1113-00A        1   5.00
    

    【讨论】:

    • 我从一个 excel 文件中获取这些数据。我想编辑数据以获得如您所见的输出,但您缺少重要部分。文件编号和数量正在更新。然后我添加到一个数组,因为我想将数据导出到一个 excel 文件。我可以轻松完成您所展示的内容,但这里没有解决主要问题。
    猜你喜欢
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2016-07-28
    • 2017-03-23
    • 1970-01-01
    相关资源
    最近更新 更多