繁体   English   中英

golang如何格式化txt?

[英]How to format a txt in golang?

我有一个 json 是动态的,我将其转换为 txt: JSON 的示例:

   {name: luis, last name: gomez, id_number: 87846516}

我转换它的代码是这样的:

    file, _: = json.MarshalIndent (string (jsonData), "", "")

    data: = ioutil.WriteFile ("test.txt", file, 0644)

我成功地将它转换为 txt 但我需要给它一个特定的格式,其中只有值出现而没有标签,并且分隔如下:

     luis | gomez | 87846516

格式我不知道怎么给它。

您似乎正在从数据库中获取数据,然后将其保存到文本文件中。 最好的方法是从数据库中获取数据,然后简单地遍历每一行。 目前尚不清楚为什么将问题提出为转换 json 数据(如果它可从数据库中获得)。 与其将其转换为 json,不如直接将值写入文件。

您可以打开一个文件,以便附加每个条目,然后在完成文件后关闭。 我提供了一个示例文件,它将为您提供所需的 output,而不管返回的行数(我假设它是数据库中每一行的新行)或列数。

以下代码经过测试并打印: luis | gomez | 87846516 luis | gomez | 87846516

OS.APPEND 每次写入时都会 append 换行。 因此,如果您多次运行此代码,它不会覆盖它而是添加到文件中。

package main

import (
    "database/sql"
    "fmt"
    "log"
    "os"
    "strings"

    _ "github.com/go-sql-driver/mysql"
)

type DbDao struct {
    db *sql.DB
}

var db DbDao

func (d *DbDao) Init(connstr string) error {

    db, err := sql.Open("mysql", connstr)
    if err != nil {
        return err
    }
    err = db.Ping()
    if err != nil {
        return err
    }
    d.db = db
    return nil
}

func main() {

    dblogin := os.Getenv("DBLOGIN")
    dbString := fmt.Sprintf("root:%s@/testDB", dblogin)
    err := db.Init(dbString)
    if err != nil {
        log.Fatal("Failed to create db connection:", err.Error())
    }

    f, err := os.OpenFile("text.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
    if err != nil {
        log.Fatalf("ERROR: error opening file: %v", err)
    }
  defer f.Close()

    queryText := "select * from stackOverflow"
    rows, err := db.db.Query(queryText)
    if err != nil {
        log.Fatal(err)
    }

    columns, err := rows.Columns()
    if err != nil {
        log.Fatal(err)
    }

    count := len(columns)
    values := make([]interface{}, count)
    scanArgs := make([]interface{}, count)
    for i := range values {
        scanArgs[i] = &values[i]
    }

    for rows.Next() {
        err := rows.Scan(scanArgs...)
        if err != nil {
            log.Fatal(err)
        }

        concat := make([]string, 0)
        for i, _ := range columns {
            v := values[i]

            b, ok := v.([]byte)
            if ok {
                concat = append(concat, string(b))
            } else {
                concat = append(concat, fmt.Sprintf("%v", v))
            }
        }
        line := strings.Join(concat, " | ")
        fmt.Println(line)
        _, err = f.Write([]byte(fmt.Sprintf("%s\n", line)))
        if err != nil {
            log.Fatal(err)
        }

    }

    return
}

首先创建 struct object 称为Person ,然后定义一个String function 来做你想做的事

package main

import (
    "encoding/json"
    "strconv"
)

type Person struct {
    Name     string `json:"name"`
    LastName string `json:"last_name"`
    IdNumber int    `json:"id_number"`
}

// Convert to csv separated by " | "
func (p Person) String() string {
    return p.Name + " | " + p.LastName + " | " + strconv.Itoa(p.IdNumber)
}

func main() {

    // json data
    jsonData := map[string]interface{}{
        "name":      "luis",
        "last_name": "gomez",
        "id_number": 87846516,
    }

    person := Person{}
    jsonDataByte, _ := json.Marshal(jsonData)
    json.Unmarshal(jsonDataByte, &person)

    // print person
    println(person.String())
}

答案是:

luis | gomez | 87846516

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM