登录
首页 >  Golang >  Go问答

清洗并读取 CSV 文件

来源:stackoverflow

时间:2024-02-07 21:00:24 147浏览 收藏

从现在开始,努力学习吧!本文《清洗并读取 CSV 文件》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

问题内容

我正在使用 encoding/csv 库读取一个大 csv 文件。

但是这个文件有点不标准,包含非转义引号 " 破坏了 parser.read() 的读者:

2022/06/09 17:33:54 第 2 行第 5 列解析错误:引用字段中存在无关或缺失的 "

如果我使用 parser.lazyquotes = true,我会得到:

2022/06/09 17:34:15 第2行记录:字段数量错误

有错误的 csv 文件(减少到最小值)foo.csv

1|2
"a|b

所以我需要删除所有出现的双引号 " 并且我目前正在使用 sed 's/"//g' 从终端对整个文件执行此操作,但我想从 go 脚本中删除它相反。

知道我正在读取这样的文件,我应该怎么做:

func processCSV(filepath string){
    file, err := os.Open("foo.csv")
    if err != nil {
        log.Fatal(err)
    }

    parser := csv.NewReader(file)
    parser.Comma = '|'
    // parser.LazyQuotes = true

    _, err = parser.Read() // skip headers

    for {
        record, err := parser.Read()
        if err == io.EOF {
            break
        }
        if err != nil {
            log.Fatal(err)
        }

        // process record

    }
}

正确答案


创建一个 io.Reader,从通过底层 io.reader 读取的数据中删除引号。

// rmquote reads r with " removed.
type rmquote struct {
    r io.reader
}

func (c rmquote) read(p []byte) (int, error) {
    n, err := c.r.read(p)

    // i is output position for loop below
    i := 0

    // for each byte read from the file
    for _, b := range p[:n] {

        // skip quotes
        if b == '"' {
            continue
        }

        // copy byte to output position and advance position
        p[i] = b
        i++
    }

    // output position is the new length
    return i, err
}

将其插入 csv 读取器和文件之间:

parser := csv.NewReader(rmquote{file})

今天关于《清洗并读取 CSV 文件》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>