我目前正在为工作项目设置文件上传。上传的文件应包含具有必要数据和所有变体(例如大小或长度)的所有项目。问题是,我无法将变体数据导出到与一般项目数据相同的文件中,所以我想,因为我已经使用 powershell 脚本处理和上传,我可以在使用 powershell 上传结果之前合并这两个文件作为好。
以下是两个 CSV 文件的标题:
feed_file
Artikelnummer,EAN,Hersteller,Produktname,EKPreis,UVP,Produktbeschreibung,ProduktURL,BildURL,Bestand
variant_file
"VaterArtikelnummer";"Artikelnummer";"UVP";"Bestand";"Variationsname1";"Variationsname2";"Variationsname3";"Variationswertname1";"Variationswertname2";"Variationswertname3";"EKPreis"
“Artikelnummer”是这两个文件的通用键,因为它包含每个文件仅出现一次的唯一编号,并且变体文件中的大多数(但不是全部)条目也存在于基本提要文件中。
这是合并过程的代码(因为它目前不工作,它仍然包含在它自己的文件中,所以没有其他代码可能会干扰它):
# Set the base path for the script and all relevant files
$path = "C:/path/to/files/and/script"
# Get the most recent item and variation csv files and import them
$feed_file = Import-Csv (get-childitem -path "$path/files/article/*" -Include *.csv | Sort-Object CreationTime -Descending | Select-Object -first 1)
$variant_file = Import-Csv (get-childitem -path "$path/jtlExport/*" -Include Export_*.csv | Sort-Object CreationTime -Descending | Select-Object -first 1) -Delimiter ";"
<# Generate an output where the following is true:
- Any item that is not a variant (not in $variant_file) gets assigned the already present data from $feed_file and appropriate empty columns at the end
- Any item that is a variant gets assigned the full data set, including any information about the variant
#>
$output = Foreach($item in $feed_file){
$variant_file | Where-Object Artikelnummer -eq $item.Artikelnummer -ov result
If(-not $result){
[PSCustomObject]@{
Artikelnummer = $item.Artikelnummer
EAN = $item.EAN
Hersteller = $item.Hersteller
Produktname = $item.Produktname
EKPreis = $item.EKPreis
UVP = $item.UVP
Produktbeschreibung = $item.Produktbeschreibung
ProduktURL = $item.ProduktURL
BildURL = $item.BildURL
Bestand = $item.Bestand
VaterArtikelnummer = ""
Variationsname1 = ""
Variationsname2 = ""
Variationsname3 = ""
Variationswertname1 = ""
Variationswertname2 = ""
Variationswertname3 = ""
}
}
Else{
Foreach($variant in $variant_file){
If($item.Artikelnummer -eq $variant.Artikelnummer){
[PSCustomObject]@{
Artikelnummer = $item.Artikelnummer
EAN = $item.EAN
Hersteller = $item.Hersteller
Produktname = $item.Produktname
EKPreis = $item.EKPreis
UVP = $item.UVP
Produktbeschreibung = $item.Produktbeschreibung
ProduktURL = $item.ProduktURL
BildURL = $item.BildURL
Bestand = $item.Bestand
VaterArtikelnummer = $variant.VaterArtikelnummer
Variationsname1 = $variant.Variationsname1
Variationsname2 = $variant.Variationsname2
Variationsname3 = $variant.Variationsname3
Variationswertname1 = $variant.Variationswertname1
Variationswertname2 = $variant.Variationswertname2
Variationswertname3 = $variant.Variationswertname3
}
}
}
}
}
# Export the output as a csv file ready to upload
$output | Export-Csv -Path "$path/sample.csv" -Encoding UTF8 -NoTypeInformation
虽然一般的代码很可能会得到很大的改进,但我很高兴它正在做我想做的事,因为它花了很长时间在互联网上搜索以找到一种方法来合并在我的情况下工作的两个文件(尽管我仍然很感激任何提示和建议)。
尽管有一个我似乎根本无法弄清楚的问题,尽管输出是按照我想要的方式处理的,但存在一个问题,即作为变体的每个项目在最终输出中都会出现两次,但其中一个条目缺少大部分数据。这是一个例子:
"12345678_9",,,,"388,7","894,00",,,,"1","12345678","Größe","","","58","",""
"12345678_9","3210987654321","Hersteller","Produktname","388.70","894","Beschreibung","ProduktURL","BildURL","0","12345678","Größe","","","58","",""
如您所见,输出文件中的第一个条目(对于具有变体数据的每个项目)是一个精简版本,丢失了大部分原始数据,但仍保留了一些数据。我的第一个猜测是该项目以某种方式列出了两次,但如果我检查使用的原始两个输入文件,我只能在任一文件中找到任何项目的一个条目,任何地方都没有双打。
我还尝试更改代码的第一部分(对于没有变体数据的任何项目)以在某些列中输出固定字符串,虽然这对任何不是变体的项目都有影响,但双精度仍然有空列地方所以我认为它必须与处理具有匹配变体数据的项目的后半部分有关,但我无法理解究竟是什么导致了这个问题。
我在 Windows Server 2016 上使用 Powershell 5.1,我希望有人能告诉我这个问题可能显而易见的答案。提前感谢大家的帮助!
最好的祝福
-凯文
编辑:Hansson0728 提供的解决方案完美运行,对“AllInLeft”类型进行了微调,但它似乎也比我笨重的手动方法快得多。