如何读取数组或切片的子集

时间:2018-07-17 16:16:31

标签: go slice

在Go中,我现在可以读取一个excel文件并将其放入切片中。

我也知道如何读取特定单元格的值。

但是我现在想读取初始切片的一个子集,因此基本上只读取例如10至15行和23至25列。

我下面的代码没有做到这一点,它读取第35和36行以及所有列。如何仅将第23至25列读入df2?

package main

import (
    "fmt"

    "github.com/360EntSecGroup-Skylar/excelize"
)

func main() {
    xlsx, err := excelize.OpenFile("/media/Snaps/test.xlsm")
    if err != nil {
        fmt.Println(err)
        return
    }

    rows := xlsx.GetRows("ticker")

    df2 := rows[10:15][23:25]
    fmt.Println(df2)
}

1 个答案:

答案 0 :(得分:1)

我认为这里的关键是停止将其视为行和列。在您的代码中,您正在对切片片进行操作。您可以对外部级别进行切片以获取所需的行,然后对其进行迭代以从每一行获取所需的列。但是,如果仅获取切片,则未使用的所有数据仍将作为备份切片的数组的一部分保存在内存中。为了提高内存效率,您可能需要将所需的数据复制到具有新后备阵列的全新切片中:

    rows := xlsx.GetRows("ticker")

    df2 := make([][]string, 5) // I don't know what data type the cells are, assuming string, adjust the number to the number of rows you want to avoid unnecessary allocations)
    idx := 0
    for _, row := range rows[10:15] { // iterate over desired rows
        df2row := make([]string, 2) // again, assuming 2 columns of string cells, adjust as needed
        copy(df2row, row[23:25]) // copy desired columns to new row slice
        df2[idx] = df2row
        idx++
    }

    fmt.Println(df2)

这里有一个非常详尽的切片操作概要:https://blog.golang.org/go-slices-usage-and-internals

这是一个可运行的游乐场示例,其中生成了伪数据:https://play.golang.org/p/wRKcTpnTUA2