github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/encoding/kmgExcel/TitleArrayToGrid.go (about)

     1  package kmgExcel
     2  
     3  import (
     4  	"fmt"
     5  )
     6  
     7  //transform from title array to grid
     8  //titleArray should call Trim2DArray already
     9  func TitleArrayToGrid(titleArray [][]string) (output []map[string]string, err error) {
    10  	titleArray = Trim2DArray(titleArray)
    11  	lenTitleArray := len(titleArray)
    12  	if lenTitleArray <= 1 {
    13  		return []map[string]string{}, nil
    14  	}
    15  	output = make([]map[string]string, lenTitleArray-1)
    16  	titles := titleArray[0]
    17  	lenTitles := len(titles)
    18  	for rowIndex := 1; rowIndex < lenTitleArray; rowIndex++ {
    19  		row := titleArray[rowIndex]
    20  		r := make(map[string]string)
    21  		lenRow := len(row)
    22  		//there can be some blank row of left of row
    23  		if lenRow > lenTitles {
    24  			return nil, fmt.Errorf(
    25  				"titleArrayToGrid not all row length less or equal than first row length,"+
    26  					"rowIndex: %d thisRowLen:%d firstRowLen:%d", rowIndex, lenRow, lenTitles)
    27  		}
    28  		for cellIndex := 0; cellIndex < lenRow; cellIndex++ {
    29  			cell := row[cellIndex]
    30  			r[titles[cellIndex]] = cell
    31  		}
    32  		output[rowIndex-1] = r
    33  	}
    34  	return output, nil
    35  }
    36  
    37  //transform from grid to title array
    38  //keys not in title will return an error
    39  // key in title but not in element map ,value will be "" in titleArray
    40  // len(grid)==0 will return a titleArray only have title in it.
    41  func GridToTitleArrayWithTitle(grid []map[string]string, title []string) (titleArray [][]string, err error) {
    42  	if len(grid) == 0 {
    43  		return [][]string{title}, nil
    44  	}
    45  	titleArray = make([][]string, len(grid)+1)
    46  	lenTitle := len(title)
    47  	titleIndexMap := make(map[string]int, lenTitle)
    48  	titleArray[0] = title
    49  	for i, key := range title {
    50  		titleIndexMap[key] = i
    51  	}
    52  	for i, row := range grid {
    53  		titleArray[i+1] = make([]string, lenTitle)
    54  		for key, value := range row {
    55  			j, exist := titleIndexMap[key]
    56  			if !exist {
    57  				return nil, fmt.Errorf("[GridToTitleArray][i:%d] key[%s] in grid Row,but not in title", i, key)
    58  			}
    59  			titleArray[i+1][j] = value
    60  		}
    61  	}
    62  	return
    63  }