Я сейчас нахожусь в процессе настройки загрузки файла для рабочего проекта. Загруженный файл должен содержать все элементы с необходимыми данными и все варианты (например, размер или длина). Проблема в том, что я не могу экспортировать данные вариации в тот же файл, что и данные общих элементов, поэтому я решил, что так как я уже обработал и загрузил с помощью сценария 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» - это общий ключ для обоих файлов, поскольку он содержит уникальные числа, которые появляются только один раз для каждого файла и большинство (но не все) записи в файле варианта также присутствуют в файле подачи basi c.
Вот код для процесса слияния (поскольку он в настоящее время не работает, он все еще содержится в своем собственном файле поэтому нет другого кода, который мог бы мешать ему):
# 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
Хотя код в целом, скорее всего, можно значительно улучшить, я просто счастлив, что он делает то, что я хочу, после того, как потратив довольно много времени на поиски inte rnet, чтобы найти способ объединить два файла, которые работали в моем случае (хотя я все равно буду благодарен за любые советы и предложения).
Хотя есть одна проблема, которую я просто не могу понять, хотя выходные данные обрабатываются так, как я хочу, есть проблема, что каждый элемент, который является вариантом, заканчивается дважды в окончательный вывод, но в одной из записей пропущена большая часть данных. Вот пример:
"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","",""
Как вы можете видеть, первая запись в выходном файле (для каждого отдельного элемента, содержащего данные о вариантах) является урезанной версией, пропуская большинство исходных данных, в то время как все еще сохраняя некоторые. Мое первое предположение состояло в том, что элемент каким-то образом указан дважды, но если я проверю исходные два входных файла, которые использовались, я могу найти только одну запись в любом файле для любого из элементов, нигде не дублируется.
Я также попытался изменить первую часть своего кода (для любых элементов без данных о вариантах), чтобы выводить фиксированную строку в определенных столбцах, и хотя это оказало влияние на любой элемент, который не является вариантом, на двойную в этом месте все еще были пустые столбцы, поэтому я предполагаю, что это должно быть связано с последней частью, которая обрабатывает элементы, которые имеют соответствующие данные вариантов, но я просто не могу понять, что именно вызывает эту проблему.
Я использую Powershell 5.1 на Windows Server 2016, надеюсь, кто-нибудь покажет мне, вероятно, очевидный ответ на этот вопрос. Заранее благодарю всех за помощь!
С уважением
-Kevin
Редактировать: Решение, предоставленное Hansson0728, работало отлично, с незначительной настройкой типа "AllInLeft" "но это также, кажется, намного быстрее, чем мой громоздкий ручной метод.