猿问

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

我有一个尴尬的 csv 文件,我需要跳过第一行来阅读它。


我用 python/pandas 很容易做到这一点


df = pd.read_csv(filename, skiprows=1)

但我不知道如何在 Go 中做到这一点。


package main


import (

    "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 fields

PM_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_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



守着一只汪
浏览 177回答 4
4回答

梦里花落0921

读取 csv 文件时跳过第一行例如,package mainimport (    "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.csvone,two,three,four1,2,34,5,6$ go run sample.go[[1 2 3] [4 5 6]]$ $ cat sample.csvPTN 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$ 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]]$

吃鸡游戏

只需调用即可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]]

慕运维8079593

我们可以使用bufio.ReadBytes('\n')bufio 作为 Reader 并将其传递给 csv.NewReaderfunc 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}

幕布斯7119047

虽然了解 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}
随时随地看视频慕课网APP

相关分类

Go
我要回答