[英]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.