Использование Go для создания текстовых файлов из столбцов фрейма данных CSV - PullRequest
1 голос
/ 31 января 2020

Я пытаюсь l oop над файлом csv и выводить текстовый файл с заголовком после каждой строки в первом столбце. Каждый текстовый файл затем заполняется данными из других строк для этого столбца. Я могу напечатать содержимое csv в текстовый файл, но не могу получить logi c, используя для l oop, чтобы получить индекс первого столбца и использовать его для создания / заголовка новый .txt файл.

package main

import (
    "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 Ответ

2 голосов
/ 31 января 2020

Возьмите несколько столбцов из CSV и напечатайте каждый столбец в новый текстовый файл.

L oop поверх 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
$ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...