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

使用 Go 从 csv 数据框的列创建文本文件

使用 Go 从 csv 数据框的列创建文本文件

Go
至尊宝的传说 2022-05-10 16:21:59
我正在尝试遍历csv文件并输出标题为第一列中每一行的文本文件。然后用该列的其他行中的数据填充每个文本文件。我能够将内容打印csv到文本文件中,但是我无法使用 for 循环来获取逻辑以获取第一列的索引并使用它来创建/命名一个新.txt文件。package mainimport (    "fmt"    "io"    "io/ioutil"    "log"    "os")func main() {    fmt.Println("Enter file path to CSV: ")    var csvFile string    _, err := fmt.Scanln(&csvFile)    if err != nil {        log.Fatal("Cannot read input")        return    }    //open file    inFile, err := os.Open(csvFile)    if err != nil {        log.Fatal(err)    }    defer inFile.Close()    readMe, _ := ioutil.ReadAll(inFile)    blankFile, err := os.Create(`C:\temp\test.txt`)    if err != nil {        log.Fatal(err)    }    defer blankFile.Close()    //write data to text file    outFile, err := blankFile.Write(readMe)    if err == io.EOF {        log.Fatalln("Failed")    } else if err != nil {        log.Fatal(err)    }    //print bytes total    fmt.Println(outFile, " bytes printed")}
查看完整描述

1 回答

?
慕斯709654

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

从 csv 中获取多列并将每一列打印到一个新的文本文件中。


循环一个 csv 并生成一个新的文本文件,该文件将在第 1 行中的每一列之后命名。然后将使用该列的其他行中的数据填充每个文本文件。


例如,


package main


import (

    "encoding/csv"

    "fmt"

    "io"

    "os"

    "path/filepath"

)


func CsvFileToTxtFiles(inFile string) error {

    in, err := os.Open(inFile)

    if err != nil {

        return err

    }

    defer in.Close()

    r := csv.NewReader(in)

    hdr, err := r.Read()

    if err != nil {

        return err

    }

    f := make([]*os.File, len(hdr))

    w := make([]*csv.Writer, len(hdr))

    pfx := filepath.Clean(inFile)

    pfx = pfx[:len(pfx)-len(filepath.Ext(pfx))]

    for i, col := range hdr {

        var err error

        f[i], err = os.Create(pfx + "." + col + ".txt")

        if err != nil {

            return err

        }

        defer f[i].Close()

        w[i] = csv.NewWriter(f[i])

        if err != nil {

            return err

        }

        defer w[i].Flush()

    }


    for {

        row, err := r.Read()

        if err != nil {

            if row == nil && err == io.EOF {

                break

            }

            return err

        }

        for i, col := range row {

            err := w[i].Write([]string{col})

            if err != nil {

                return err

            }

        }

    }


    for i := range hdr {

        var err error

        w[i].Flush()

        err = w[i].Error()

        if err != nil {

            return err

        }

        err = f[i].Close()

        if err != nil {

            return err

        }

    }


    return nil

}


func main() {

    if len(os.Args) <= 1 {

        usage := "usage: " + filepath.Base(os.Args[0]) + " FILE"

        fmt.Fprintln(os.Stderr, usage)

        return

    }

    inFile := os.Args[1]

    err := CsvFileToTxtFiles(inFile)

    if err != nil {

        fmt.Fprintln(os.Stderr, err)

        return

    }

}

输出:


$ cat ioj.test.csv

one,two,three

1,2,3

11,22,33

$ go run ioj.go ioj.test.csv

$ cat ioj.test.one.txt

1

11

$ cat ioj.test.two.txt

2

22

$ cat ioj.test.three.txt

3

33


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

添加回答

举报

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