使用golang通过分块方式读取超大Excel(包含100列100W行)并随机取20W行数据
### 回答1:
使用golang读取超大Excel可以使用第三方库"github.com/360EntSecGroup-Skylar/excelize"。它支持读取XLSX格式的Excel文件。
读取Excel文件的方式如下:
package main
import (
"fmt"
"github.com/360EntSecGroup-Skylar/excelize"
)
func main() {
f, err := excelize.OpenFile("./test.xlsx")
if err != nil {
fmt.Println(err)
return
}
// 读取指定sheet中的数据
rows := f.GetRows("Sheet1")
for _, row := range rows {
for _, colCell := range row {
fmt.Print(colCell, "\t")
}
fmt.Println()
}
}
随机取20W行数据可以使用rand包来实现。在读取Excel文件之后,可以使用rand.Perm函数来生成随机数组,然后根据随机数组中的索引来取出数据。
代码示例如下:
package main
import (
"fmt"
"github.com/360EntSecGroup-Skylar/excelize"
"math/rand"
"time"
)
func main() {
f, err := excelize.OpenFile("./test.xlsx")
if err != nil {
fmt.Println(err)
return
}
// 读取指定sheet中的数据
rows := f.GetRows("Sheet1")
rand.Seed(time.Now().UnixNano())
// 随机取20W行数据
numRows := len(rows)
randIndex := rand.Perm(numRows)[:20000]
for _, index := range randIndex {
row := rows[index]
for _, colCell := range row {
fmt.Print(colCell, "\t")
}
fmt.Println()
}
}
这里虽然给出了一个例子,但是对于100列100W行的数据来说,用上述方式读取性能可能会有影响,建议考虑到数
### 回答2:
使用golang读取超大Excel文件并随机获取其中的20W行数据,可以通过以下步骤:
1. 使用go语言中的Excel文件处理库(如excelize)打开Excel文件。
2. 获取Excel文件的行数和列数。
3. 根据行数随机生成20W个不重复的行索引值,并将这些索引值存储在一个切片中。
4. 遍历切片中的索引值,读取对应行的数据。
5. 将读取到的数据保存到一个新的Excel文件中,作为结果输出。
以下是一个示例代码,用于演示如何使用golang读取超大Excel文件并随机获取20W行数据:
go
package main
import (
"fmt"
"math/rand"
"github.com/xuri/excelize/v2"
)
func main() {
// 打开Excel文件
f, err := excelize.OpenFile("path/to/large_excel.xlsx")
if err != nil {
fmt.Println(err)
return
}
// 获取Excel文件的行数和列数
rows, _ := f.GetRows("Sheet1")
rowCount := len(rows)
colCount := len(rows[0])
// 创建一个切片用于存储随机生成的行索引值
var randomIndexes []int
// 随机生成20W个不重复的行索引值
for i := 0; i < 200000; {
index := rand.Intn(rowCount)
// 如果生成的索引值已存在于切片中,则重新生成
if !contains(randomIndexes, index) {
randomIndexes = append(randomIndexes, index)
i++
}
}
// 创建一个新的Excel文件用于保存随机获取到的数据
newFile := excelize.NewFile()
newSheet := "RandomData"
// 遍历随机生成的行索引值,读取对应行的数据并保存到新的Excel文件中
for i, index := range randomIndexes {
for j := 0; j < colCount; j++ {
cell, _ := f.GetCellValue("Sheet1", getCellName(j, index))
newFile.SetCellValue(newSheet, getCellName(j, i), cell)
}
}
// 保存新的Excel文件
err = newFile.SaveAs("path/to/random_data.xlsx")
if err != nil {
fmt.Println(err)
return
}
fmt.Println("随机数据已保存到新的Excel文件中")
}
// 判断切片中是否包含某个值
func contains(s []int, e int) bool {
for _, v := range s {
if v == e {
return true
}
}
return false
}
// 根据列索引和行索引获取对应的单元格名称
func getCellName(colIndex, rowIndex int) string {
colName := string('A' + colIndex)
return fmt.Sprintf("%s%d", colName, rowIndex+1)
}
在上述示例中,使用excelize库打开Excel文件并获取行数和列数。然后,通过随机生成不重复的行索引值来模拟获取随机行的数据。最后,将读取到的数据保存到一个新的Excel文件中。
请根据实际需求修改代码中的文件路径和行列数等参数。注意,读取和保存超大Excel文件可能会消耗大量的内存和时间,请确保系统资源充足。
### 回答3:
使用golang读取超大Excel文件,并随机选择其中20万行数据的方法如下:
1. 首先,我们需要安装和导入golang对Excel文件操作的包,推荐使用github.com/tealeg/xlsx包。首先使用以下命令安装该包:
go get github.com/tealeg/xlsx
2. 导入所需的包:
import (
"github.com/tealeg/xlsx"
"math/rand"
)
3. 创建一个Excel文件对象:
file, err := xlsx.OpenFile("your_excel_file.xlsx")
if err != nil {
log.Fatal(err)
}
4. 选择要读取的工作表:
sheet := file.Sheets[0]
5. 获取工作表中的所有行:
rows := sheet.Rows
6. 计算工作表中总共有多少行数据:
totalRows := len(rows)
7. 创建一个存储随机行索引的切片:
randIndexes := rand.Perm(totalRows)[:200000]
8. 遍历切片中的随机行索引,读取并处理对应行的数据:
for _, rowIndex := range randIndexes {
row := rows[rowIndex]
// 处理行数据
}
以上步骤就可以使用golang读取超大Excel文件并随机选择20万行数据。这里使用了第三方包github.com/tealeg/xlsx,在第4步我们选择了要读取的工作表,在第5步通过Sheet对象的Rows属性获取了所有行数据,在第6步我们计算了总共有多少行数据。在第7步我们使用rand.Perm函数生成了一个随机排列的数字切片,然后根据切片中的索引获取对应的行数据,处理行数据的部分可以根据具体需求进行编写。通过这种方式,我们可以读取超大Excel文件中的随机行数据。