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

读取csv文件时如何跳过第一行?

读取csv文件时如何跳过第一行?

Go
守着一只汪 2023-06-26 17:52:49
我有一个尴尬的 csv 文件,我需要跳过第一行来阅读它。我用 python/pandas 很容易做到这一点df = pd.read_csv(filename, skiprows=1)但我不知道如何在 Go 中做到这一点。package mainimport (    "encoding/csv"    "fmt"    "log"    "os")type mwericsson struct {    id     string    name   string    region string}func main() {    rows := readSample()    fmt.Println(rows)    //appendSum(rows)    //writeChanges(rows)}func readSample() [][]string {    f, err := os.Open("D:/in/20190629/PM_IG30014_15_201906290015_01.csv")    if err != nil {        log.Fatal(err)    }    rows, err := csv.NewReader(f).ReadAll()    f.Close()    if err != nil {        log.Fatal(err)    }    return rows}错误:2019/07/01 12:38:40 record on line 2: wrong number of fieldsPM_IG30014_15_201906290015_01.csv:PTN Ethernet-Port RMON Performance,PORT_BW_UTILIZATION,2019-06-29 20:00:00,33366     DeviceID,DeviceName,ResourceName,CollectionTime,GranularityPeriod,PORT_RX_BW_UTILIZATION,PORT_TX_BW_UTILIZATION,RXGOODFULLFRAMESPEED,TXGOODFULLFRAMESPEED,PORT_RX_BW_UTILIZATION_MAX,PORT_TX_BW_UTILIZATION_MAX3174659,H1095,H1095-11-ISM6-1(to ZJBSC-V1),2019-06-29 20:00:00,15,22.08,4.59,,,30.13,6.983174659,H1095,H1095-14-ISM6-1(to T6147-V),2019-06-29 20:00:00,15,2.11,10.92,,,4.43,22.45
查看完整描述

4 回答

?
梦里花落0921

TA贡献1772条经验 获得超5个赞

读取 csv 文件时跳过第一行


例如,


package main


import (

    "bufio"

    "encoding/csv"

    "fmt"

    "io"

    "os"

)


func readSample(rs io.ReadSeeker) ([][]string, error) {

    // Skip first row (line)

    row1, err := bufio.NewReader(rs).ReadSlice('\n')

    if err != nil {

        return nil, err

    }

    _, err = rs.Seek(int64(len(row1)), io.SeekStart)

    if err != nil {

        return nil, err

    }


    // Read remaining rows

    r := csv.NewReader(rs)

    rows, err := r.ReadAll()

    if err != nil {

        return nil, err

    }

    return rows, nil

}


func main() {

    f, err := os.Open("sample.csv")

    if err != nil {

        panic(err)

    }

    defer f.Close()

    rows, err := readSample(f)

    if err != nil {

        panic(err)

    }

    fmt.Println(rows)

}

输出:


$ cat sample.csv

one,two,three,four

1,2,3

4,5,6

$ go run sample.go

[[1 2 3] [4 5 6]]


$ cat sample.csv

PTN Ethernet-Port RMON Performance,PORT_BW_UTILIZATION,2019-06-29 20:00:00,33366     

DeviceID,DeviceName,ResourceName,CollectionTime,GranularityPeriod,PORT_RX_BW_UTILIZATION,PORT_TX_BW_UTILIZATION,RXGOODFULLFRAMESPEED,TXGOODFULLFRAMESPEED,PORT_RX_BW_UTILIZATION_MAX,PORT_TX_BW_UTILIZATION_MAX

3174659,H1095,H1095-11-ISM6-1(to ZJBSC-V1),2019-06-29 20:00:00,15,22.08,4.59,,,30.13,6.98

3174659,H1095,H1095-14-ISM6-1(to T6147-V),2019-06-29 20:00:00,15,2.11,10.92,,,4.43,22.45

$ go run sample.go

[[DeviceID DeviceName ResourceName CollectionTime GranularityPeriod PORT_RX_BW_UTILIZATION PORT_TX_BW_UTILIZATION RXGOODFULLFRAMESPEED TXGOODFULLFRAMESPEED PORT_RX_BW_UTILIZATION_MAX PORT_TX_BW_UTILIZATION_MAX] [3174659 H1095 H1095-11-ISM6-1(to ZJBSC-V1) 2019-06-29 20:00:00 15 22.08 4.59   30.13 6.98] [3174659 H1095 H1095-14-ISM6-1(to T6147-V) 2019-06-29 20:00:00 15 2.11 10.92   4.43 22.45]]

$


查看完整回答
反对 回复 2023-06-26
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

只需调用即可Reader.Read()读取一行,然后使用 继续读取其余部分Reader.ReadAll()

看这个例子:

src := "one,two,three\n1,2,3\n4,5,6"


r := csv.NewReader(strings.NewReader(src))

if _, err := r.Read(); err != nil {

    panic(err)

}


records, err := r.ReadAll()

if err != nil {

    panic(err)

}

fmt.Println(records)

输出(在Go Playground上尝试):


[[1 2 3] [4 5 6]]


查看完整回答
反对 回复 2023-06-26
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

我们可以使用bufio.ReadBytes('\n')bufio 作为 Reader 并将其传递给 csv.NewReader


func readSample(reader io.Reader) ([][]string, error) {

    // if reader is bufio, we don't need to NewReader againg

    buf, ok := (reader).(*bufio.Reader)

    if !ok {

        buf = bufio.NewReader(reader)

    }

    _, err := buf.ReadBytes('\n')

    if err != nil {

        return nil, err

    }


    rows, err := csv.NewReader(buf).ReadAll()

    if err != nil {

        return nil, err

    }

    return rows, nil

}



查看完整回答
反对 回复 2023-06-26
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

虽然了解 io.ReadSeeker 的信息很丰富,但我认为跳过 csv 的第一行/行(通常是标题)的更简单方法是使用切片功能,如下所示:


func readCsv(filename string) [][]string {

    f, err := os.Open(filename)

    if err != nil {

        log.Fatal(err)

    }

    defer f.Close()

    records := [][]string{}

    r := csv.NewReader(f)

    for {

        record, err := r.Read()

        if err == io.EOF {

            break

        }

        if err != nil {

            log.Fatal(err)

        }

        records = append(records, record)

    }

    return records[1:] // skip the header

}


查看完整回答
反对 回复 2023-06-26
  • 4 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信