Как отсортировать последовательность столбцов 2D-массива в AutoIt

Резюме:

Я ищу правильный способ сортировки 2D (многомерного) массива по последовательности столбцов в AutoIt. Я хорошо знаком с AutoIt, и есть функция _ArraySort, которая обеспечивает сортировку по столбцам, которая приводит к отсортированным строкам. Но мне нужно отсортировать порядок / последовательность столбцов в направлении столбцов (в алфавитном порядке).

Предпосылки и цель:

Для отчета о тестовом примере, который я создаю (файл HTML), мне нужно отобразить в нем таблицу. Эта таблица должна содержать данные части результата теста.

Я уже добился:

Я прочитал файл CSV в массив (по определенному разделителю), что не является проблемой. Я могу отсортировать 2D-массив для последовательности строк, и анализ и преобразование в структуру HTML для отчета также не проблема.

Но то, чего я хочу достичь, отображается в таблице примеров внизу. Обратите внимание, что пример содержит только примерные данные. В результате тестирования реальное содержимое массива будет иметь гораздо больше столбцов и строк в массиве. Но этого должно быть достаточно, чтобы понять идею.

Код:

Это просто пример данных массива, как показано ниже:

Global $a2dData[6][6]

$a2dData[0][0] = 'fruits'
$a2dData[0][1] = 'IT manufactures'
$a2dData[0][2] = 'painters'
$a2dData[0][3] = 'music genres'
$a2dData[0][4] = 'days'

$a2dData[1][0] = 'apple'
$a2dData[1][1] = 'Google'
$a2dData[1][2] = 'Picasso'
$a2dData[1][3] = 'Jazz'
$a2dData[1][4] = 'Monday'

$a2dData[2][0] = 'Orange'
$a2dData[2][1] = 'Microsoft'
$a2dData[2][2] = 'Van Gogh'
$a2dData[2][3] = 'Blues'
$a2dData[2][4] = 'Thursday'

$a2dData[3][0] = 'Pear'
$a2dData[3][1] = ''
$a2dData[3][2] = 'Da Vinci'
$a2dData[3][3] = 'Hip Hop'
$a2dData[3][4] = 'Friday'

$a2dData[4][0] = ''
$a2dData[4][1] = 'Apple'
$a2dData[4][2] = 'Monet'
$a2dData[4][3] = 'Rap'
$a2dData[4][4] = 'Sunday'

$a2dData[5][0] = 'Cherry'
$a2dData[5][1] = 'Adobe'
$a2dData[5][2] = 'Michelangelo'
$a2dData[5][3] = 'Classic'
$a2dData[5][4] = ''

_ArrayDisplay( $a2dData )

А теперь, как отсортировать последовательность столбцов 2D-массива в AutoIt?

Фактические данные массива до сортировки последовательности столбцов:

| fruits | IT manufactures | painters     | music genres | days     |
| apple  | Google          | Picasso      | Jazz         | Monday   |
| Orange | Microsoft       | Van Gogh     | Blues        | Thursday |
| Pear   |                 | Da Vinci     | Hip Hop      | Friday   |
|        | Apple           | Monet        | Rap          | Sunday   |
| Cherry | Adobe           | Michelangelo | Classic      |          |

Ожидаемые данные массива после сортировки последовательности столбцов:

| days     | fruits | IT manufactures | music genres | painters     |
| Monday   | apple  | Google          | Jazz         | Picasso      |
| Thursday | Orange | Microsoft       | Blues        | Van Gogh     |
| Friday   | Pear   |                 | Hip Hop      | Da Vinci     |
| Sunday   |        | Apple           | Rap          | Monet        |
|          | Cherry | Adobe           | Classic      | Michelangelo |

Есть ли уже функция для этого или я должен делать это самостоятельно?


person Community    schedule 07.02.2019    source источник


Ответы (2)


Это соответствует вашим ожиданиям?

#include <Array.au3>
Global $a2dData[6][5]

$a2dData[0][0] = 'fruits'
$a2dData[0][1] = 'IT manufactures'
$a2dData[0][2] = 'painters'
$a2dData[0][3] = 'music genres'
$a2dData[0][4] = 'days'

$a2dData[1][0] = 'apple'
$a2dData[1][1] = 'Google'
$a2dData[1][2] = 'Picasso'
$a2dData[1][3] = 'Jazz'
$a2dData[1][4] = 'Monday'

$a2dData[2][0] = 'Orange'
$a2dData[2][1] = 'Microsoft'
$a2dData[2][2] = 'Van Gogh'
$a2dData[2][3] = 'Blues'
$a2dData[2][4] = 'Thursday'

$a2dData[3][0] = 'Pear'
$a2dData[3][1] = ''
$a2dData[3][2] = 'Da Vinci'
$a2dData[3][3] = 'Hip Hop'
$a2dData[3][4] = 'Friday'

$a2dData[4][0] = ''
$a2dData[4][1] = 'Apple'
$a2dData[4][2] = 'Monet'
$a2dData[4][3] = 'Rap'
$a2dData[4][4] = 'Sunday'

$a2dData[5][0] = 'Cherry'
$a2dData[5][1] = 'Adobe'
$a2dData[5][2] = 'Michelangelo'
$a2dData[5][3] = 'Classic'
$a2dData[5][4] = ''

_ArrayDisplay($a2dData, 'BEFORE')
_ArrayTranspose($a2dData)
_ArraySort($a2dData)
_ArrayTranspose($a2dData)
_ArrayDisplay($a2dData, 'AFTER' )

Пока, Мега

person Xenobiologist    schedule 07.02.2019

Да:

Решение Xenobiologist в точности соответствует моим ожиданиям, спасибо. Но я не могу использовать комментарий, чтобы сказать это.

Другое решение:

Тем временем я тоже решил это самостоятельно (но не таким элегантным способом):

Global $a2dData[6][6]

$a2dData[0][0] = 'fruits'
$a2dData[0][1] = 'IT manufactures'
$a2dData[0][2] = 'painters'
$a2dData[0][3] = 'music genres'
$a2dData[0][4] = 'days'

$a2dData[1][0] = 'apple'
$a2dData[1][1] = 'Google'
$a2dData[1][2] = 'Picasso'
$a2dData[1][3] = 'Jazz'
$a2dData[1][4] = 'Monday'

$a2dData[2][0] = 'Orange'
$a2dData[2][1] = 'Microsoft'
$a2dData[2][2] = 'Van Gogh'
$a2dData[2][3] = 'Blues'
$a2dData[2][4] = 'Thursday'

$a2dData[3][0] = 'Pear'
$a2dData[3][1] = ''
$a2dData[3][2] = 'Da Vinci'
$a2dData[3][3] = 'Hip Hop'
$a2dData[3][4] = 'Friday'

$a2dData[4][0] = ''
$a2dData[4][1] = 'Apple'
$a2dData[4][2] = 'Monet'
$a2dData[4][3] = 'Rap'
$a2dData[4][4] = 'Sunday'

$a2dData[5][0] = 'Cherry'
$a2dData[5][1] = 'Adobe'
$a2dData[5][2] = 'Michelangelo'
$a2dData[5][3] = 'Classic'
$a2dData[5][4] = ''

Func _arraySortColumnSequence( $a2dArray, $iAscOrDesc )
    Local $aJustColumns[1]
    For $i = 0 To UBound( $a2dArray, 2 ) - 2 Step 1
        _ArrayAdd( $aJustColumns, $a2dArray[0][$i] )
    Next

    _ArrayDelete( $aJustColumns, 0 )
    _ArraySort( $aJustColumns, $iAscOrDesc )

    Local $aNew2dArray[UBound( $a2dArray, 1 )][UBound( $a2dArray, 2 )]
    For $i = 0 To UBound( $aJustColumns ) - 1 Step 1
        For $j = 0 To UBound( $aJustColumns ) - 1 Step 1
            If $a2dArray[0][$j] = $aJustColumns[$i] Then
                For $k = 0 To UBound( $a2dArray, 1 ) - 1 Step 1
                    $aNew2dArray[$k][$i] = $a2dArray[$k][$j]
                Next
            EndIf
        Next
    Next

    Return $aNew2dArray
EndFunc


_ArrayDisplay( $a2dData, 'before' )

Global $a2dDataRes = _arraySortColumnSequence( $a2dData, 0 )

_ArrayDisplay( $a2dDataRes, 'after' )
person Community    schedule 07.02.2019
comment
Рад, что смог помочь, и вы нашли решение. - person Xenobiologist; 07.02.2019