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))
}

结果: Captura de ecrã 2023-01-12 153641


更多关于Golang如何正确从API获取CSV数据的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

很可能是一个字节顺序标记

更多关于Golang如何正确从API获取CSV数据的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢 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编码的文件开头出现。

回到顶部