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
}
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
- 2 回答
- 0 关注
- 165 浏览
添加回答
举报