Golang:从1个CSV文件中获取数据到另一个

时间:2014-10-18 08:34:20

标签: go

我是Golang的新手,我正在尝试将1个csv文件提取到另一个新的csv文件,但我只需要旧csv文件中的2个记录。

您如何仅获取该文件的前两个记录?

这是我到目前为止所尝试的内容(也在play.golang.org中):

package main

import (
    "encoding/csv"
    "fmt"
    "io"
    "os"
)

func main() {

    //SELECTING THE FILE TO EXTRACT.......

    csvfile1, err := os.Open("data/sample.csv")
    if err != nil {
        fmt.Println(err)
        return
    }

    defer csvfile1.Close()

    reader := csv.NewReader(csvfile1)

    for i := 0; i < 3; i++ {
        record, err := reader.Read()
        if err == io.EOF {
            break
        } else if err != nil {
            fmt.Println(err)
            return
        }
        csvfile2, err := os.Create("data/SingleColomReading.csv")
        if err != nil {
            fmt.Println(err)
            return
        }
        defer csvfile2.Close()

        records := []string{
            record,
        }
        writer := csv.NewWriter(csvfile2)
        //fmt.Println(writer)
        for _, single := range records {

            er := writer.Write(single)
            if er != nil {
                fmt.Println("error", er)
                return
            }

            fmt.Println(single)

            writer.Flush()
            //fmt.Println(records)
            //a:=strconv.Itoa(single)
            n, er2 := csvfile2.WriteString(single)
            if er2 != nil {
                fmt.Println(n, er2)
            }

        }
    }
}

2 个答案:

答案 0 :(得分:2)

它更容易:

  • 将您的csv文件读入a string array (one line per element),仅限两个第一行

    var lines []string
    scanner := bufio.NewScanner(file)
    nblines := 0
    for scanner.Scan() {
        lines = append(lines, scanner.Text())
        if nblines++; nblines >= 2 {
            break
        }
    }
    
  • 然后您可以使用range lines在目标文件中写下这两行 lines最多包含2个元素。

答案 1 :(得分:1)

修复程序,

package main

import (
    "encoding/csv"
    "fmt"
    "io"
    "os"
)

func main() {
    csvfile1, err := os.Open("data/sample.csv")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer csvfile1.Close()
    reader := csv.NewReader(csvfile1)
    csvfile2, err := os.Create("data/SingleColomReading.csv")
    if err != nil {
        fmt.Println(err)
        return
    }
    writer := csv.NewWriter(csvfile2)

    for i := 0; i < 2; i++ {
        record, err := reader.Read()
        if err != nil {
            if err == io.EOF {
                break
            }
            fmt.Println(err)
            return
        }
        err = writer.Write(record)
        if err != nil {
            fmt.Println(err)
            return
        }
    }
    writer.Flush()
    err = csvfile2.Close()
    if err != nil {
        fmt.Println(err)
        return
    }
}

但是,由于您只对整个记录(行)而不是记录的单个字段感兴趣,因此可以使用bufio.Scanner作为@VonC建议。例如,

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    csvfile1, err := os.Open("data/sample.csv")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer csvfile1.Close()
    scanner := bufio.NewScanner(csvfile1)
    csvfile2, err := os.Create("data/SingleColomReading.csv")
    if err != nil {
        fmt.Println(err)
        return
    }
    writer := bufio.NewWriter(csvfile2)

    nRecords := 0
    for scanner.Scan() {
        n, err := writer.Write(scanner.Bytes())
        if err != nil {
            fmt.Println(n, err)
            return
        }
        err = writer.WriteByte('\n')
        if err != nil {
            fmt.Println(err)
            return
        }
        if nRecords++; nRecords >= 2 {
            break
        }
    }
    if err := scanner.Err(); err != nil {
        fmt.Println(err)
        return
    }
    err = writer.Flush()
    if err != nil {
        fmt.Println(err)
        return
    }
    err = csvfile2.Close()
    if err != nil {
        fmt.Println(err)
        return
    }
}