Golang中如何将Excel读取的二维切片行转换为DataFrame?
解决Excel转DataFrame时的索引越界问题
问题详情
从Excel读取数据并转换为gota的DataFrame时,读取到的行是二维切片类型,运行代码后触发索引越界错误:
panic: runtime error: index out of range [1] with length 1
goroutine 1 [running]:
问题根源:数据共4列,但第25行仅第一列有值,当转换包含该行及后续的30行数据时触发错误;仅转换到第25行时可正常运行。
用户提供的代码:
import ( "fmt" "github.com/go-gota/gota/dataframe" "github.com/xuri/excelize/v2" ) func main() { f, err := excelize.OpenFile(sheetPath) if err != nil { fmt.Print(err) } rows, err := f.GetRows(sheetName) if err != nil { fmt.Print(err) } df := dataframe.LoadRecords(rows, dataframe.HasHeader(true)) }
解决方法
必须先处理行长度不一致的问题——gota的LoadRecords要求所有数据行的长度和表头列数完全匹配,否则会因尝试访问不存在的索引而panic。
具体处理步骤:
- 确定表头的列数(此处为4列)
- 遍历所有数据行,对长度不足的行补充空字符串,使其长度与表头一致;若行长度超过列数,可按需截断到对应长度
- 使用处理后的二维切片生成DataFrame
修改后的代码示例:
import ( "fmt" "github.com/go-gota/gota/dataframe" "github.com/xuri/excelize/v2" ) func main() { sheetPath := "your_excel_file.xlsx" sheetName := "Sheet1" f, err := excelize.OpenFile(sheetPath) if err != nil { fmt.Println(err) return } defer f.Close() // 释放文件资源 rows, err := f.GetRows(sheetName) if err != nil { fmt.Println(err) return } if len(rows) == 0 { fmt.Println("工作表中无数据") return } // 获取表头列数(默认第一行为表头) colCount := len(rows[0]) processedRows := make([][]string, len(rows)) // 统一每行的长度 for i, row := range rows { processedRow := make([]string, colCount) // 复制原有数据 copy(processedRow, row) // 对长度不足的列填充空字符串 for j := len(row); j < colCount; j++ { processedRow[j] = "" } processedRows[i] = processedRow } // 转换为DataFrame df := dataframe.LoadRecords(processedRows, dataframe.HasHeader(true)) fmt.Println(df) }
补充说明
- 代码通过
copy保留原有数据,对缺失列补充空字符串,确保每行长度与表头一致 - 若存在行长度超过表头列数的情况,可添加
row = row[:colCount]进行截断 - 增加
defer f.Close()避免文件资源泄漏
内容的提问来源于stack exchange,提问作者twinkle
相关产品推荐
相关产品推荐

