Поменять местами строки и столбцы 2D-массива

Мне нужно получить столбцы из файла CSV в массив (многомерный массив или массив массивов). Я использовал CSV.au3, который отлично загружает строки, но мне нужны столбцы в этом месте. Мой CSV-файл выглядит так:

Item 1, Item 2, Another Item
Item 3, Item 4

Он создает многомерный массив, который выглядит так:

$aResult[0] = [0] => 'Item 1', [1] => 'Item 2', [2] => 'Another Item'
$aResult[1] = [0] => 'Item 3', [1] => 'Item 4'

Где бы я хотел, чтобы это выглядело:

$aResult[0] = [0] => 'Item 1', [1] => 'Item 3'
$aResult[1] = [0] => 'Item 2', [1] => 'Item 4'
$aResult[2] = [0] => 'Another Item'

Для каждой строки он должен содержать столбец, а не строку.


person Michael Smith    schedule 27.10.2013    source источник


Ответы (3)


Транспонировать массив

он должен содержать столбец, а не строку.

Согласно Документация - Справочник по функциям - _ArrayTranspose():

Транспонирует одномерный или двухмерный массив (меняет местами строки и столбцы)

CSV-файл в массив

получить столбцы в файле CSV и загрузить их в массив

CSV-файл в двумерный массив согласно Документация - Справочник по функциям - _2 _ :

Читает указанный файл в 1D или 2D массив

Пример:

#include <File.au3> ; _FileReadToArray() and $FRTA_NOCOUNT
#include <Array.au3>; _ArrayDisplay()

Global Const $g_sFileCSV         = 'C:\file.csv'
Global Const $g_sDelimiterColumn = ','

Global       $g_aCSV

_FileReadToArray($g_sFileCSV, $g_aCSV, $FRTA_NOCOUNT, $g_sDelimiterColumn)

If @error Then    
    ConsoleWrite('_FileReadToArray() error: ' & @error & @LF)    
Else    
    _ArrayDisplay($g_aCSV)    
EndIf

Массив в файл CSV

_FileWriteFromArray() сохраняет массив как текстовый файл.

person user4157124    schedule 21.09.2017

У меня был перерыв в этом проекте на некоторое время, и в конце концов я понял это сам:

;Load the first line into an array (for our Count Later)
$columnsCounter = StringSplit($content[1], ",")
;Here we use the row count (from $content) and column count (from $columnsCounter)
;We define an array that is the perfect size for our Menu Items
Dim $MenuItems[$content[0] + 1][$columnsCounter[0] + 1]

; Now we loop through each row and column
For $x = 1 To ($content[0]) - 1
    ;Create an array with the row we are looking at
    $oneRow = StringSplit($content[$x], ",")
    ;now loop through each column
    For $y = 1 To ($columnsCounter[0])
        ;Grab the item we want and add it to our menu items array
        $MenuItems[$x][$y] = $oneRow[$y]
    Next
Next
person Michael Smith    schedule 28.10.2014

Вот пример CSV в 2D-массив. Кредиты Малки.

#include <array.au3>

Opt("MustDeclareVars", 1)

Dim $sCSV = '"010","2","03"' & @CRLF & _
        '"24","30","20"' & @CRLF & _
        '"txt","bla","toto"'

Local $arr = _CsvToArray2D($sCSV)
_ArrayDisplay($arr)

; Converts CSV format to a 2D array.
Func _CsvToArray2D($sCSV)
    Local $aTmp = StringRegExp($sCSV & @CR, '(\V*)\v{1,2}', 3)
    Local $NumCols[UBound($aTmp)]
    For $x = 0 To UBound($aTmp) - 1
        StringReplace($aTmp[$x], ",", ",")
        $NumCols[$x] = @extended + 1
    Next
    Local $Max = _ArrayMax($NumCols, 1)

    Dim $aArr[UBound($aTmp)][$Max]

    For $i = 0 To UBound($aArr, 1) - 1
        Local $aTemp = StringSplit($aTmp[$i], ",")
        For $j = 0 To $aTemp[0] - 1
            $aArr[$i][$j] = $aTemp[$j + 1]
        Next
    Next
    Return $aArr
EndFunc  ;==>_CsvToArray2D
;========> End of _CsvToArray2D ======================
person Milos    schedule 28.10.2013