使用上面单元格中的数据填充csv文件中的单元格
我有一个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
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
希望它能为您解决。订单号的第一行是否始终填充?订单号的第一行是否始终填充?