为了账号安全,请及时绑定邮箱和手机立即绑定

读取前清理 CSV 文件

读取前清理 CSV 文件

Go
阿晨1998 2022-12-19 20:29:18
我正在阅读一个带有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    }}
查看完整描述

1 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

创建一个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})


查看完整回答
反对 回复 2022-12-19
  • 1 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号