Golang如何正确从API获取CSV数据
Golang如何正确从API获取CSV数据 我正在开始学习Go语言。 我一直在探索这门语言,并开始尝试获取一些API数据,但在获取一个返回CSV文件的URL时遇到了问题。 我的日志中出现了两个奇怪的符号,有人能帮我解决这个问题吗? 也许我在处理CSV类型时没有正确获取数据。
package main
import (
"io/ioutil"
"log"
"net/http"
)
func main(){
resp, err := http.Get("http://api.tradingeconomics.com/fred/historical/BAMLC0A1CAAAEY?c=guest:guest&d1=2017-05-01&d2=2019-01-01&f=csv")
if err != nil {
log.Fatalln(err)
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalln(err)
}
log.Println(string("RESULT:"))
log.Println(string(body))
}
结果:

更多关于Golang如何正确从API获取CSV数据的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
感谢 NobbZ,我之前不知道 BOM。 经过一番研究,我找到了这个主题,它帮助我移除了这些符号。 https://gist.github.com/jaypozo/eaf13f7ecfec68b408cf
如果有人有更好的解决方案,请提供建议。
你的代码在获取CSV数据时遇到了编码问题。API返回的是UTF-8编码的CSV文件,但其中包含了BOM(字节顺序标记)字符。以下是正确的解决方案:
package main
import (
"encoding/csv"
"io"
"log"
"net/http"
"strings"
)
func main() {
resp, err := http.Get("http://api.tradingeconomics.com/fred/historical/BAMLC0A1CAAAEY?c=guest:guest&d1=2017-05-01&d2=2019-01-01&f=csv")
if err != nil {
log.Fatalln(err)
}
defer resp.Body.Close()
// 读取响应体
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatalln(err)
}
// 移除BOM字符(如果存在)
content := strings.TrimPrefix(string(body), "\ufeff")
// 创建CSV读取器
reader := csv.NewReader(strings.NewReader(content))
// 读取所有记录
records, err := reader.ReadAll()
if err != nil {
log.Fatalln(err)
}
// 处理CSV数据
for i, record := range records {
if i == 0 {
log.Printf("Header: %v", record)
} else {
log.Printf("Row %d: %v", i, record)
}
}
}
或者使用更高效的方式逐行读取:
package main
import (
"encoding/csv"
"io"
"log"
"net/http"
)
func main() {
resp, err := http.Get("http://api.tradingeconomics.com/fred/historical/BAMLC0A1CAAAEY?c=guest:guest&d1=2017-05-01&d2=2019-01-01&f=csv")
if err != nil {
log.Fatalln(err)
}
defer resp.Body.Close()
// 直接使用响应体创建CSV读取器
reader := csv.NewReader(resp.Body)
// 逐行读取
for {
record, err := reader.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatalln(err)
}
log.Printf("%v", record)
}
}
如果你需要处理BOM字符,可以使用专门的库:
package main
import (
"encoding/csv"
"io"
"log"
"net/http"
"golang.org/x/text/encoding/unicode"
"golang.org/x/text/transform"
)
func main() {
resp, err := http.Get("http://api.tradingeconomics.com/fred/historical/BAMLC0A1CAAAEY?c=guest:guest&d1=2017-05-01&d2=2019-01-01&f=csv")
if err != nil {
log.Fatalln(err)
}
defer resp.Body.Close()
// 使用UTF-8 BOM解码器
utf8bom := unicode.UTF8BOM
decoder := unicode.BOMOverride(utf8bom.NewDecoder())
// 创建转换后的读取器
reader := transform.NewReader(resp.Body, decoder)
// 创建CSV读取器
csvReader := csv.NewReader(reader)
// 读取数据
records, err := csvReader.ReadAll()
if err != nil {
log.Fatalln(err)
}
for _, record := range records {
log.Printf("%v", record)
}
}
第一个示例是最直接的解决方案,它移除了BOM字符并正确解析了CSV数据。你看到的奇怪符号就是BOM字符(\ufeff),它在UTF-8编码的文件开头出现。

