Go语言使用之File工具类

说明:后续会继续补充此工具类。

一、方法说明

1、文件拷贝

//封装的文件拷贝方法
func CopyFile(dstName string, srcName string) (written int64, err error) {
    src, err := os.Open(srcName)
    CheckError(err)
    defer src.Close()
    dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
    CheckError(err)
    defer dst.Close()
    //拷贝文件
    return io.Copy(dst, src)
}

2、判断文件或者目录存在的方法

func PathExists(path string) (bool, error) {
    _, err := os.Stat(path)
    if err == nil { // 文件或者目录存在
        log.Fatal(err)
        return true, nil
    }
    if os.IsNotExist(err) {
        return false, nil
    }
    return false, err
}

3、获取文件信息

//获取文件信息
func GetFileInfo(file *os.File){
    //获取文件信息
    FileInfo, err :=file.Stat()
    CheckError(err)
    fmt.Println("FileInfo=",FileInfo)
    /*
    type FileInfo interface {
    Name() string       // 文件的名字(不含扩展名)
    Size() int64        // 普通文件返回值表示其大小;其他文件的返回值含义各系统不同
    Mode() FileMode     // 文件的模式位
    ModTime() time.Time // 文件的修改时间
    IsDir() bool        // 等价于Mode().IsDir()
    Sys() interface{}   // 底层数据来源(可以返回nil)
    }
    */
    fmt.Printf("Name=%v \nSize=%d \nMode= %v \nModTime=%v \nIsDir=%v \nSys=%v \n",
    FileInfo.Name(),FileInfo.Size(),FileInfo.Mode(),FileInfo.ModTime(),FileInfo.IsDir(),FileInfo.Sys())

}

4、字符统计:

type charCount struct {
    ChCount    int //英文
    NumCount   int //数字 
    SpaceCount int //空格
    OtherCount int //其它字符数量
}
//统计英文、数字、空格和其他字符数量
func CharCountImp(filePath string) {
    file, err := os.Open(filePath) //说明这里需要事先准备一个 c:/test.txt 文件来进行测试
    if err != nil {
        fmt.Println("read file err:", err)
        return
    }
    defer file.Close()

    var count charCount

    reader := bufio.NewReader(file)
    for {
        str, err := reader.ReadString('\n')
        if err == io.EOF {
            break
        }
        if err != nil {
            fmt.Printf("read file failed, err:%v", err)
            break
        }

        runeArr := []rune(str) //转成 []rune,可以处理中文字符
        for _, v := range runeArr {

            switch {
            case v >= 'a' && v <= 'z':
                fallthrough
            case v >= 'A' && v <= 'Z':
                count.ChCount++
            case v == ' ' || v == '\t':
                count.SpaceCount++
            case v >= '0' && v <= '9':
                count.NumCount++
            default:
                count.OtherCount++
            }
        }

    }

    fmt.Printf("char count:%d\n", count.ChCount)
    fmt.Printf("num count:%d\n", count.NumCount)
    fmt.Printf("space count:%d\n", count.SpaceCount)
    fmt.Printf("other count:%d\n", count.OtherCount)
}

二、完整代码:

package utils

import (
    "bufio"
    "log"
    "io"
    "fmt"
    "os"
)

//封装的文件拷贝方法
func CopyFile(dstName string, srcName string) (written int64, err error) {
    src, err := os.Open(srcName)
    CheckError(err)
    defer src.Close()
    dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
    CheckError(err)
    defer dst.Close()
    //拷贝文件
    return io.Copy(dst, src)
}

//判断文件或者目录存在的方法
func PathExists(path string) (bool, error) {
    _, err := os.Stat(path)
    if err == nil { // 文件或者目录存在
        log.Fatal(err)
        return true, nil
    }
    if os.IsNotExist(err) {
        return false, nil
    }
    return false, err
}
//获取文件信息
func GetFileInfo(file *os.File){
    //获取文件信息
    FileInfo, err :=file.Stat()
    CheckError(err)
    fmt.Println("FileInfo=",FileInfo)
    /*
    type FileInfo interface {
    Name() string       // 文件的名字(不含扩展名)
    Size() int64        // 普通文件返回值表示其大小;其他文件的返回值含义各系统不同
    Mode() FileMode     // 文件的模式位
    ModTime() time.Time // 文件的修改时间
    IsDir() bool        // 等价于Mode().IsDir()
    Sys() interface{}   // 底层数据来源(可以返回nil)
    }
    */
    fmt.Printf("Name=%v \nSize=%d \nMode= %v \nModTime=%v \nIsDir=%v \nSys=%v \n",
    FileInfo.Name(),FileInfo.Size(),FileInfo.Mode(),FileInfo.ModTime(),FileInfo.IsDir(),FileInfo.Sys())

}
//错误检查
func CheckError(err error) {
    if err != nil {
        log.Fatal(err)
        // panic(err)
    }
}

type charCount struct {
    ChCount    int //英文
    NumCount   int //数字 
    SpaceCount int //空格
    OtherCount int //其它字符数量
}
//统计英文、数字、空格和其他字符数量
func CharCountImp(filePath string) {
    file, err := os.Open(filePath) //说明这里需要事先准备一个 c:/test.txt 文件来进行测试
    if err != nil {
        fmt.Println("read file err:", err)
        return
    }
    defer file.Close()

    var count charCount

    reader := bufio.NewReader(file)
    for {
        str, err := reader.ReadString('\n')
        if err == io.EOF {
            break
        }
        if err != nil {
            fmt.Printf("read file failed, err:%v", err)
            break
        }

        runeArr := []rune(str) //转成 []rune,可以处理中文字符
        for _, v := range runeArr {

            switch {
            case v >= 'a' && v <= 'z':
                fallthrough
            case v >= 'A' && v <= 'Z':
                count.ChCount++
            case v == ' ' || v == '\t':
                count.SpaceCount++
            case v >= '0' && v <= '9':
                count.NumCount++
            default:
                count.OtherCount++
            }
        }

    }

    fmt.Printf("char count:%d\n", count.ChCount)
    fmt.Printf("num count:%d\n", count.NumCount)
    fmt.Printf("space count:%d\n", count.SpaceCount)
    fmt.Printf("other count:%d\n", count.OtherCount)
}
### 回答1: 使用 Go 语言读取超大 Excel 文件可以使用第三方库 "github.com/360EntSecGroup-Skylar/excelize"。 以下是一个使用流式 NewStreamWriter 读取 Excel 文件的示例代码: ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize" "github.com/tealeg/xlsx" ) func main() { xlsxFile, err := xlsx.OpenFile("large-file.xlsx") if err != nil { fmt.Println(err) return } for _, sheet := range xlsxFile.Sheets { for _, row := range sheet.Rows { for _, cell := range row.Cells { fmt.Printf("%s\n", cell.String()) } } } } ``` 在这个例子中,我们使用 xlsx 库打开一个名为 "large-file.xlsx" 的 Excel 文件,然后使用迭代器遍历文件中的每一个单元格并输出它的内容。 注意: 您需要在您的项目中安装xlsx 下载方法: go get github.com/tealeg/xlsx ### 回答2: 在Go语言中,我们可以使用流式的NewStreamWriter来读取超大的Excel文件。下面是示例代码: ```go package main import ( "encoding/csv" "fmt" "io" "os" ) func main() { filePath := "path/to/your/excel/file.xlsx" // 替换为你的Excel文件路径 // 打开Excel文件 file, err := os.Open(filePath) if err != nil { fmt.Println("无法打开Excel文件:", err) return } defer file.Close() // 创建CSV读取器 reader := csv.NewReader(file) // 初始化读取器,设置分隔符为制表符,同时跳过第一行(表头) reader.Comma = '\t' reader.Read() // 创建CSV写入器 writer := csv.NewWriter(os.Stdout) // 从读取器中逐行读取数据,并写入到写入器中 for { record, err := reader.Read() // 读取一行记录 if err == io.EOF { break } else if err != nil { fmt.Println("读取Excel文件发生错误:", err) return } err = writer.Write(record) // 写入一行记录到写入器中 if err != nil { fmt.Println("写入CSV文件发生错误:", err) return } } writer.Flush() // 清空缓冲区,将数据输出至标准输出 if err := writer.Error(); err != nil { fmt.Println("刷新写入器发生错误:", err) return } } ``` 请替换代码中的`filePath`变量为你的Excel文件的路径,代码将会使用流式的方式读取Excel文件的数据,并将其写入到标准输出中。你可以根据实际需求对代码进行修改,例如将数据写入到文件中或将其进行处理等操作。 ### 回答3: 在golang中,可以使用流式的方法来读取超大的Excel文件。下面给出一个示例代码: ```go package main import ( "bufio" "encoding/csv" "fmt" "io" "log" "os" ) func main() { // 打开Excel文件 file, err := os.Open("large_excel.csv") if err != nil { log.Fatal(err) } defer file.Close() // 创建一个新的Reader reader := csv.NewReader(bufio.NewReader(file)) // 逐行读取和处理数据 for { // 读取一行数据 record, err := reader.Read() if err == io.EOF { break } if err != nil { log.Fatal(err) } // 处理数据,这里只是简单打印出来 fmt.Println(record) } } ``` 上述代码中使用了CSV格式,若需处理其他格式的Excel文件,可参考相关的库或者API来实现。读取文件时,使用`os.Open`打开文件,然后使用`bufio.NewReader`将文件数据包装成一个可读的流。通过`csv.NewReader`方法来创建一个新的Reader。循环读取数据直到文件末尾,这里处理数据的方式只是简单地打印出来。可以根据具体需求对数据进行处理。 需要注意的是,读取超大的Excel文件可能会占用大量的内存,因此可以考虑分批次处理数据,或者使用并发来提高处理速度。另外,读取超大文件可能会遇到性能问题,可以选择使用专门的处理库或者工具来处理这类需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值