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

golang如何格式化txt?

golang如何格式化txt?

Go
ABOUTYOU 2022-10-17 09:53:08
我有一个动态的 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格式我不知道怎么给它。
查看完整描述

2 回答

?
森栏

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

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


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


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


OS.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

}



查看完整回答
反对 回复 2022-10-17
?
白板的微信

TA贡献1883条经验 获得超3个赞

首先创建 struct object called Person,然后定义一个String函数来做你想做的事


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


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

添加回答

举报

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