2 回答

TA貢獻1810條經驗 獲得超5個贊
您似乎正在從數據庫中獲取數據,然后將其保存到文本文件中。最好的方法是從數據庫中獲取數據,然后簡單地遍歷每一行。目前尚不清楚為什么將問題提出為轉換 json 數據,如果它可以從數據庫中獲得。與其將其轉換為 json,不如直接將值寫入文件。
您可以打開一個文件,以便附加每個條目,然后在完成文件后關閉。我提供了一個示例文件,無論返回的行數(我假設數據庫中的每一行都是一個新行)或列數,它都會為您提供所需的輸出。
以下代碼經過測試并打?。簂uis | 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 關注
- 189 瀏覽
添加回答
舉報