第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 os.Create() 后將 CSV 文件加載到 bigquery 中不加載數(shù)據(jù)

在 os.Create() 后將 CSV 文件加載到 bigquery 中不加載數(shù)據(jù)

Go
守著一只汪 2022-10-10 15:42:59
我正在嘗試運行以下流程:從某處獲取數(shù)據(jù)創(chuàng)建新的本地 CSV 文件,將數(shù)據(jù)寫入該文件將 CSV 上傳到 Bigquery刪除本地文件但它似乎加載了空數(shù)據(jù)。這是代碼:func (c *Client) Do(ctx context.Context) error {    bqClient, err := bigquerypkg.NewBigQueryUtil(ctx, "projectID", "datasetID")    if err != nil {        return err    }    data, err := c.GetSomeData(ctx)    if err != nil {        return err    }    file, err := os.Create("example.csv")    if err != nil {        return err    }    defer file.Close()    // also file need to be delete    writer := csv.NewWriter(file)    defer writer.Flush()    timestamp := time.Now().UTC().Format("2006-01-02 03:04:05.000000000")    for _, d := range data {        csvRow := []string{            d.ID,            d.Name,            timestamp,        }        err = writer.Write(csvRow)        if err != nil {            log.Printf("error writing data to CSV: %v\n", err)        }    }    source := bigquery.NewReaderSource(file)    source.Schema = bigquery.Schema{        {Name: "id", Type: bigquery.StringFieldType},        {Name: "name", Type: bigquery.StringFieldType},        {Name: "createdAt", Type: bigquery.TimestampFieldType},    }    if _, err = bqClient.LoadCsv(ctx, "tableID", source); err != nil {        return err    }    return nil}LoadCSV()看起來像這樣:func (c *Client) LoadCsv(ctx context.Context, tableID string, src bigquery.LoadSource) (string, error) {    loader := c.bigQueryClient.Dataset(c.datasetID).Table(tableID).LoaderFrom(src)    loader.WriteDisposition = bigquery.WriteTruncate    job, err := loader.Run(ctx)    if err != nil {        return "", err    }    status, err := job.Wait(ctx)    if err != nil {        return job.ID(), err    }    if status.Err() != nil {        return job.ID(), fmt.Errorf("job completed with error: %v", status.Err())    }    return job.ID(), nil}運行后,bigquery 會創(chuàng)建架構(gòu)但沒有數(shù)據(jù)。如果我要更改os.Create()為os.Open()并且文件已經(jīng)存在,那么一切正常。就像加載CSV時文件數(shù)據(jù)還沒有寫入(?)是什么原因?
查看完整描述

1 回答

?
慕無忌1623718

TA貢獻1744條經(jīng)驗 獲得超4個贊

我在這里看到的問題是您沒有將文件句柄的光標(biāo)倒回到文件的開頭。因此,下一次讀取將在文件末尾,并且將是 0 字節(jié)讀取。這就解釋了為什么文件中似乎沒有內(nèi)容。

https://pkg.go.dev/os#File.Seek可以為您處理。

實際上,這Flush無關(guān)緊要,因為您使用相同的文件句柄來讀取文件而不是寫入文件,因此即使沒有刷新,您也會看到自己寫入的字節(jié)。如果文件由不同的進程打開或重新打開,則不會出現(xiàn)這種情況。

編輯:OP聲稱在他們的情況下這種沖洗是必要的,我不能提供不同意的證據(jù)。沖洗也不會傷害任何東西。

示范:

package main


import (

    "fmt"

    "io"

    "os"

)


func main() {

    f, err := os.CreateTemp("", "data.csv")

    if err != nil {

        panic(err)

    } else {

        defer f.Close()

        defer os.Remove(f.Name())

    }

    fmt.Fprintf(f, "hello, world")

    fmt.Fprintln(os.Stderr, "Before rewind: ")

    if _, err := io.Copy(os.Stderr, f); err != nil {

        panic(err)

    }

    f.Seek(0, io.SeekStart)

    fmt.Fprintln(os.Stderr, "\nAfter rewind: ")

    if _, err := io.Copy(os.Stderr, f); err != nil {

        panic(err)

    }

    fmt.Fprintln(os.Stderr, "\n")

}

% go run t.go

Before rewind:


After rewind:

hello, world


查看完整回答
反對 回復(fù) 2022-10-10
  • 1 回答
  • 0 關(guān)注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號