1

我试图创建一个简单的函数来将切片值附加到创建的 csv 文件的下一列。目的是在 test.csv 中有这种风格

|A 栏 |B 栏|

|标题1 |标题2|

|第一价值| 第二值 |

(抱歉格式错误,但是一旦生成了 text.csv,如果我们打开 text.csv 文件,我们的想法是在“FIRSTVALUE”之后的下一列中放置“SECONDVALUE”(如上图).. 每次调用该函数时,它都会在同一行的上一列之后继续附加下一个值)。

这就是我得到的结果,但是它是将 SECONDVALUE 直接附加到 FIRSTVALUE 的同一列上。。(所以我得到的是 "|FIRSTVALUE | SECONDVALUE" ,而不是 "|FIRSTVALUESECONDVALUE|" )

package main

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


func main() {
    callfunc()
}

func callfunc() int {

    testval1 := []string{"FIRST VALUE"}
    test(testval1, "test.csv", 1)

    testval2 := []string{"SECOND VALUE"}
    test(testval2, "test.csv", 0) //I want this to be added to the column next to first value 

    return 1
}


func test(lines []string, path string, header int) {

    var hdr = []string{"header1", "header2"}

    fmt.Println("inside the method..\n")

    file, err := os.OpenFile(path, os.O_APPEND|os.O_WRONLY, 0600)
    if err != nil {
        if file, err = os.Create(path); err != nil {
            return
        }
    }
    defer file.Close()

    writer := csv.NewWriter(file)

    if header == 1 {
        returnError := writer.Write(hdr)
        if returnError != nil {
            fmt.Println(returnError)
        }
    }

    writer.Flush()

    for _, value := range lines {
        _, err := file.WriteString(strings.TrimSpace(value))
        if err != nil { //exception handler
            fmt.Println(err)
            break
        }
    }

    writer.Flush()
}

如何修复上面的代码行,使“SECONDVALUE”是第二列,而不是在“FIRSTVALUE”所在的同一列。

4

2 回答 2

6
func addcol(fname string, column []string)  {
 // read the file
 f, err := os.OpenFile(fname, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
 if err != nil {
     fmt.Println("Error: ", err)
     return
 }
 w := csv.NewWriter(f)
 w.Write(column)
 w.Flush()
}

从https://www.reddit.com/r/golang/comments/46fdef/help_appending_a_slice_to_next_row_in_csv_file/复制

于 2018-08-13T06:58:40.100 回答
4

您的代码包含我无法清楚理解的内容,所以这里有一个小程序可以满足您的要求。你可以在它之上构建。

package main

import (
    "encoding/csv"
    "os"
)

func addcol(fname string, column []string) error {
    // read the file
    f, err := os.Open(fname)
    if err != nil {
        return err
    }
    r := csv.NewReader(f)
    lines, err := r.ReadAll()
    if err != nil {
        return err
    }
    if err = f.Close(); err != nil {
        return err
    }

    // add column
    l := len(lines)
    if len(column) < l {
        l = len(column)
    }
    for i := 0; i < l; i++ {
        lines[i] = append(lines[i], column[i])
    }

    // write the file
    f, err = os.Create(fname)
    if err != nil {
        return err
    }
    w := csv.NewWriter(f)
    if err = w.WriteAll(lines); err != nil {
        f.Close()
        return err
    }
    return f.Close()
}

func main() {
    col := []string{"column two", "a", "b", "c", "d"}
    if err := addcol("in.csv", col); err != nil {
        panic(err)
    }
}
于 2013-07-13T11:52:04.857 回答