Получить имена файлов S3, сгруппировать по 3-значному номеру со связанными изображениями в серии, затем разделить серию на столбцы и новую группу в новую строку

Я пытаюсь использовать CSV для массовой загрузки списков, однако URL-адреса изображений находятся в столбцах.

Я использую Amazon S3 для размещения изображений и PowerShell для получения ключей каждого файла. Однако я не уверен, как сгруппировать их по связанным файлам, а затем использовать что-то вроде текста для столбцов для разделения?

Файлы имеют последовательную структуру именования:

      C2-123-1.JPG
C2-123-2.JPG
C2-123-3.JPG
C3-333-1.JPG
C3-333-2.JPG

В приведенном выше примере у C2-123 есть три фотографии, у C2-333 только две, поэтому я хочу получить результат, как показано ниже.

| Ссылка на изображение 1 | Ссылка на изображение 2 | Ссылка на изображение 3 | Ссылка на изображение 4 |
| C2-123-1.JPG | C2-123-2.JPG | C2-123-3.JPG | |
| C3-333-1.JPG | C3-333-2.JPG | | |

1 ответ

Это должно работать, вы должны заменить вывод, который вы получаете от AWS.

  • С использованием $dataдля тестирования:
      $data = @'
C2-123-1.JPG
C2-123-2.JPG
C2-123-3.JPG
C3-333-1.JPG
C3-333-2.JPG
C3-333-4.JPG
C3-333-999.JPG
C3-456-2.JPG
C3-111-2.JPG
C3-999-4.JPG
'@ -split '\r?\n'
  • Сначала сгруппируйте по числам между последними -и .jpgрасширение:
      Count Name    Group
----- ----    -----
    2 1       {C2-123-1.JPG, C3-333-1.JPG}
    4 2       {C2-123-2.JPG, C3-333-2.JPG, C3-456-2.JPG, C3-111-2.JPG}
    1 3       {C2-123-3.JPG}
    2 4       {C3-333-4.JPG, C3-999-4.JPG}
    1 999     {C3-333-999.JPG}
  • Затем получить максимальное количество элементов Groupмассивы
  • Наконец, используйте whileпетля с $maxкак ссылка на актерский состав [pscustomobject]
      # Group the files
$groups = $data | Group-Object {

    [regex]::Match(
        $_,
        '(?i)(?<=\d-)(?<imagenum>\d+)\.jpg$'
    ).Groups['imagenum'].Value

}

# Determine max number of elements
$max = $groups.Count | Measure-Object -Maximum
$index = 0

# Construct the object
$result = while($max.Maximum--)
{
    $out = [ordered]@{}
    $groups.ForEach({
        $key = 'Image Link {0}' -f $_.Name
        $out[$key] = $_.Group[$index]
    })

    [pscustomobject]$out
    $index++
}

Результат будет:

      PS /> $result | Format-Table


Image Link 1 Image Link 2 Image Link 3 Image Link 4 Image Link 999
------------ ------------ ------------ ------------ --------------
C2-123-1.JPG C2-123-2.JPG C2-123-3.JPG C3-333-4.JPG C3-333-999.JPG
C3-333-1.JPG C3-333-2.JPG              C3-999-4.JPG 
             C3-456-2.JPG                           
             C3-111-2.JPG    

Чтобы увидеть regexобъяснение, которое вы можете использовать https://regex101.com/r/kARr39/1

Другие вопросы по тегам