用golang處理csv文件需掌握讀取、數(shù)據(jù)處理、寫入三個步驟。1.讀取csv先打開文件并創(chuàng)建讀取器,可用.comma設(shè)置分隔符,默認逗號;大文件宜逐行讀取,reader.read()可跳過標題行或設(shè).fieldsperrecord=-1忽略字段數(shù)檢查。2.數(shù)據(jù)處理時需將字符串轉(zhuǎn)為數(shù)字或日期等格式,并注意缺失值與異常處理,結(jié)構(gòu)體映射適合大批量數(shù)據(jù)。3.寫入csv使用csv.newwriter()創(chuàng)建寫入器,writer.write()或writer.writeall()輸出數(shù)據(jù),字段含逗號或換行符時自動加引號包裹,寫入完畢應(yīng)調(diào)用writer.flush()確保數(shù)據(jù)落盤。
處理csv文件在數(shù)據(jù)處理中是常見需求,用golang來做這件事其實挺方便的。標準庫里的encoding/csv包已經(jīng)能完成大部分讀寫任務(wù),關(guān)鍵是掌握幾個關(guān)鍵步驟。
讀取CSV文件的基本方法
要讀取CSV文件,先打開文件,然后用csv.NewReader()創(chuàng)建一個讀取器。默認情況下,它會按逗號分隔字段,如果你的CSV用的是別的分隔符(比如制表符),可以用.Comma字段設(shè)置。
舉個簡單例子:
立即學(xué)習(xí)“go語言免費學(xué)習(xí)筆記(深入)”;
file, _ := os.Open("data.csv") reader := csv.NewReader(file) records, _ := reader.ReadAll()
上面這段代碼會把整個CSV文件一次性讀進來,存成一個二維字符串數(shù)組。注意錯誤處理不能省略,這里只是簡化了寫法。
常見做法還包括逐行讀取,適合大文件:
- reader.Read() 每次讀一行
- 可以配合循環(huán)來處理每一行數(shù)據(jù)
如果CSV第一行是標題行,記得調(diào)用reader.Read()一次跳過它,或者設(shè)置reader.FieldsPerRecord = -1來忽略字段數(shù)量檢查。
處理CSV中的數(shù)據(jù)內(nèi)容
讀進來的數(shù)據(jù)都是字符串,通常需要根據(jù)業(yè)務(wù)做轉(zhuǎn)換。例如某列是數(shù)字,就要轉(zhuǎn)成int或float64;如果是日期,就得解析時間格式。
舉個例子,假設(shè)第二列是價格,你想加總:
total := 0.0 for _, record := range records { price, _ := strconv.ParseFloat(record[1], 64) total += price }
這里要注意幾點:
- 數(shù)據(jù)可能有缺失、格式不正確等問題,建議加上判斷
- 如果某些列是特定格式(如“yyYY-MM-DD”),可以用time.Parse來解析
- 對于大批量數(shù)據(jù),考慮使用結(jié)構(gòu)體映射來組織數(shù)據(jù),提升可讀性
另外,有些CSV可能會包含引號、換行甚至特殊字符,csv.Reader已經(jīng)能處理這些情況,只要原始數(shù)據(jù)保存正確就行。
把數(shù)據(jù)寫回CSV文件
寫入的過程和讀取類似,先創(chuàng)建文件,再用csv.NewWriter()生成寫入器。常用方法是:
outputFile, _ := os.Create("output.csv") writer := csv.NewWriter(outputFile) writer.WriteAll(data)
其中data是一個二維字符串切片。如果想一行一行寫,也可以用writer.Write(),每寫完一行記得調(diào)用writer.Flush()確保數(shù)據(jù)落盤。
寫入時可以調(diào)整參數(shù),比如:
- .Comma:修改分隔符
- .UseCRLF:控制是否用CRLF作為換行符(windows下常用)
特別注意,如果你的字段里本身含有逗號或者換行符,一定要用雙引號包裹,否則寫出來的CSV格式會出錯。而csv.Writer已經(jīng)自動幫你處理這個事情,不需要手動加引號。
基本上就這些。整個流程從讀取到處理再到寫回,用Go的標準庫就能搞定,不復(fù)雜但容易忽略細節(jié),比如字段類型轉(zhuǎn)換、錯誤處理、特殊符號處理等。把這些點照顧好,基本就能穩(wěn)定運行了。