首页 > 解决方案 > 如何读取数组或切片的子集

问题描述

在 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)
}

标签: goslice

解决方案


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

    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


推荐阅读