Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用上面单元格中的数据填充csv文件中的单元格_Csv_Powershell - Fatal编程技术网

使用上面单元格中的数据填充csv文件中的单元格

使用上面单元格中的数据填充csv文件中的单元格,csv,powershell,Csv,Powershell,我有一个CSV文件,其中包含以下订单信息: OrderNo SKU PaidDate BuyerName Buyer Address Buyer Phone No. NG0001 ABC1 20150727 MR A. SMITH 1 HIGH STREET 01234 567890 NG0001 DEF2 NG0001 XYZ3 NG0002

我有一个CSV文件,其中包含以下订单信息:

OrderNo     SKU     PaidDate     BuyerName         Buyer Address     Buyer Phone No.
NG0001      ABC1    20150727     MR A. SMITH       1 HIGH STREET     01234 567890
NG0001      DEF2              
NG0001      XYZ3      
NG0002      ABC1    20150728     MRS B. JONES      100 LONDON ROAD   07766 554433
NG0002      DEF2    
我需要用上面列中的数据(基于订单号)填充空列,使其成为:

OrderNo     SKU     PaidDate     BuyerName         Buyer Address     Buyer Phone No.
NG0001      ABC1    20150727     MR A. SMITH       1 HIGH STREET     01234 567890
NG0001      DEF2    20150727     MR A. SMITH       1 HIGH STREET     01234 567890
NG0001      XYZ3    20150727     MR A. SMITH       1 HIGH STREET     01234 567890
NG0002      ABC1    20150728     MRS B. JONES      100 LONDON ROAD   07766 554433
NG0002      DEF2    20150728     MRS B. JONES      100 LONDON ROAD   07766 554433
我可以在Excel公式中通过比较行之间的订单号并引用上述单元格(如果它们相同)来实现这一点,但无法在Powershell中实现这一点-是否有类似的方法:

ForEach-Object {if ($_.OrderNo=$_.OrderNo in row above) $_.PaidDate=$_.PaidDate in row above;}

还是说我完全走错了路,需要用一种更省力、更省力的方式重新思考呢?

这应该适合你:

$Data = Import-Csv "C:\temp\Testing.csv"

$i = 0
foreach ($Entry in $Data) {
    if ($Entry.PaidDate -eq "" -and $i -ne 0 -and $Data[$i].OrderNo -eq $Data[$i - 1].OrderNo) {
        $Data[$i].PaidDate = $Data[$i - 1].PaidDate
        $Data[$i].BuyerName = $Data[$i - 1].BuyerName
        $Data[$i].'Buyer Address' = $Data[$i - 1].'Buyer Address'
        $Data[$i].Buyer = $Data[$i - 1].Buyer
        $Data[$i].'Phone No.' = $Data[$i - 1].'Phone No.'
    }

    $i++
}

$Data
它所做的是测试一个空的
PaidDate
,如果是这种情况(如果它不是第一行,同样如果它与前面的条目相同
OrderNo
),那么它会将属性设置为它上面的属性


运行此操作后,
$Data
包含填充的数据,您可以从中进行处理(即,将其输出回CSV文件等)。

这应该适用于您:

$Data = Import-Csv "C:\temp\Testing.csv"

$i = 0
foreach ($Entry in $Data) {
    if ($Entry.PaidDate -eq "" -and $i -ne 0 -and $Data[$i].OrderNo -eq $Data[$i - 1].OrderNo) {
        $Data[$i].PaidDate = $Data[$i - 1].PaidDate
        $Data[$i].BuyerName = $Data[$i - 1].BuyerName
        $Data[$i].'Buyer Address' = $Data[$i - 1].'Buyer Address'
        $Data[$i].Buyer = $Data[$i - 1].Buyer
        $Data[$i].'Phone No.' = $Data[$i - 1].'Phone No.'
    }

    $i++
}

$Data
它所做的是测试一个空的
PaidDate
,如果是这种情况(如果它不是第一行,同样如果它与前面的条目相同
OrderNo
),那么它会将属性设置为它上面的属性


运行后,
$Data
包含填充的数据,您可以从那里进行处理(即,将其输出回CSV文件等)。

我的解释是,基本上,
SKU
是唯一发生变化的东西。将该文件作为CSV读取到PowerShell中,然后计算我们将用作模板的主行。当我们查看每一行时,分别将其内容与其关联的主行相匹配

#CSV文件的所有数据
$allData=导入Csv“c:\temp\test.Csv”
#包含要用作模板的完整数据的行。
$masterRows=$allData |其中对象{$\.“PaidDate”-和$\.BuyerName-和$\.“买方地址”-和$\.“买方电话号码”}
$allData |每个对象{
$singleRow=$_
$newRow=$masterRows |其中对象{$singleRow.OrderNo-eq$\.OrderNo}
$newRow.SKU=$singleRow.SKU
$newRow
}|导出CSV-NoTypeInformation“C:\temp\output.CSV”

当我们浏览每一行时,我们只需将该行
orderno
与其在
$masterRows
中匹配的对等行进行匹配。然后复制该
$masterRow
,并在将其发送到管道之前更新其SKU

我的解释是,基本上,
SKU
是唯一正在改变的东西。将该文件作为CSV读取到PowerShell中,然后计算我们将用作模板的主行。当我们查看每一行时,分别将其内容与其关联的主行相匹配

#CSV文件的所有数据
$allData=导入Csv“c:\temp\test.Csv”
#包含要用作模板的完整数据的行。
$masterRows=$allData |其中对象{$\.“PaidDate”-和$\.BuyerName-和$\.“买方地址”-和$\.“买方电话号码”}
$allData |每个对象{
$singleRow=$_
$newRow=$masterRows |其中对象{$singleRow.OrderNo-eq$\.OrderNo}
$newRow.SKU=$singleRow.SKU
$newRow
}|导出CSV-NoTypeInformation“C:\temp\output.CSV”

当我们浏览每一行时,我们只需将该行
orderno
与其在
$masterRows
中匹配的对等行进行匹配。然后复制该
$masterRow
,并在将其发送到管道之前更新其SKU

首先,我设置了一个包含csv数据的here字符串,并将其导出到一个文件中

$csv1 = @"
OrderNo,SKU,PaidDate,BuyerName,Buyer Address,Buyer Phone No.
NG0001,ABC1,20150727,MR A. SMITH,1 HIGH STREET,01234 567890
NG0001,DEF2
NG0001,XYZ3
NG0002,ABC1,20150728,MRS B. JONES,100 LONDON ROAD,07766 554433
NG0002,DEF2
"@

$csv1 | Set-Content csvfile1.csv
然后再次导入该文件

$actual = Import-Csv csvfile1.csv
使用powershell Group Object CmdLet按医嘱编号分组

$grouper = $actual | Group-Object -Property OrderNo

foreach ($group in $grouper)
{
    # Save properties from first item in group
    $paiddate = $group.Group[0].PaidDate
    $buyername = $group.Group[0].BuyerName
    $buyerAddress = $group.Group[0].'Buyer Address'
    $buyerPhoneNo = $group.Group[0].'Buyer Phone No.'
    # Copy properties if empty
    foreach ($item in $group.Group)
    {
        if ($item.PaidDate -eq $null){$item.PaidDate = $paiddate}
        if ($item.BuyerName -eq $null){$item.BuyerName = $buyername}
        if ($item."Buyer Address" -eq $null){$item."Buyer Address" = $buyerAddress}
        if ($item."Buyer Phone No." -eq $null){$item."Buyer Phone No." = $buyerPhoneNo}
    }
}
显示结果

$actual


OrderNo         : NG0001
SKU             : ABC1
PaidDate        : 20150727
BuyerName       : MR A. SMITH
Buyer Address   : 1 HIGH STREET
Buyer Phone No. : 01234 567890

OrderNo         : NG0001
SKU             : DEF2
PaidDate        : 20150727
BuyerName       : MR A. SMITH
Buyer Address   : 1 HIGH STREET
Buyer Phone No. : 01234 567890

OrderNo         : NG0001
SKU             : XYZ3
PaidDate        : 20150727
BuyerName       : MR A. SMITH
Buyer Address   : 1 HIGH STREET
Buyer Phone No. : 01234 567890

OrderNo         : NG0002
SKU             : ABC1
PaidDate        : 20150728
BuyerName       : MRS B. JONES
Buyer Address   : 100 LONDON ROAD
Buyer Phone No. : 07766 554433

OrderNo         : NG0002
SKU             : DEF2
PaidDate        : 20150728
BuyerName       : MRS B. JONES
Buyer Address   : 100 LONDON ROAD
Buyer Phone No. : 07766 554433

希望它能为您解决问题。

首先,我设置了一个包含csv数据的here字符串,并将其导出到一个文件中

$csv1 = @"
OrderNo,SKU,PaidDate,BuyerName,Buyer Address,Buyer Phone No.
NG0001,ABC1,20150727,MR A. SMITH,1 HIGH STREET,01234 567890
NG0001,DEF2
NG0001,XYZ3
NG0002,ABC1,20150728,MRS B. JONES,100 LONDON ROAD,07766 554433
NG0002,DEF2
"@

$csv1 | Set-Content csvfile1.csv
然后再次导入该文件

$actual = Import-Csv csvfile1.csv
使用powershell Group Object CmdLet按医嘱编号分组

$grouper = $actual | Group-Object -Property OrderNo

foreach ($group in $grouper)
{
    # Save properties from first item in group
    $paiddate = $group.Group[0].PaidDate
    $buyername = $group.Group[0].BuyerName
    $buyerAddress = $group.Group[0].'Buyer Address'
    $buyerPhoneNo = $group.Group[0].'Buyer Phone No.'
    # Copy properties if empty
    foreach ($item in $group.Group)
    {
        if ($item.PaidDate -eq $null){$item.PaidDate = $paiddate}
        if ($item.BuyerName -eq $null){$item.BuyerName = $buyername}
        if ($item."Buyer Address" -eq $null){$item."Buyer Address" = $buyerAddress}
        if ($item."Buyer Phone No." -eq $null){$item."Buyer Phone No." = $buyerPhoneNo}
    }
}
显示结果

$actual


OrderNo         : NG0001
SKU             : ABC1
PaidDate        : 20150727
BuyerName       : MR A. SMITH
Buyer Address   : 1 HIGH STREET
Buyer Phone No. : 01234 567890

OrderNo         : NG0001
SKU             : DEF2
PaidDate        : 20150727
BuyerName       : MR A. SMITH
Buyer Address   : 1 HIGH STREET
Buyer Phone No. : 01234 567890

OrderNo         : NG0001
SKU             : XYZ3
PaidDate        : 20150727
BuyerName       : MR A. SMITH
Buyer Address   : 1 HIGH STREET
Buyer Phone No. : 01234 567890

OrderNo         : NG0002
SKU             : ABC1
PaidDate        : 20150728
BuyerName       : MRS B. JONES
Buyer Address   : 100 LONDON ROAD
Buyer Phone No. : 07766 554433

OrderNo         : NG0002
SKU             : DEF2
PaidDate        : 20150728
BuyerName       : MRS B. JONES
Buyer Address   : 100 LONDON ROAD
Buyer Phone No. : 07766 554433

希望它能为您解决。

订单号的第一行是否始终填充?订单号的第一行是否始终填充?