Golang如何将Google表格作为CSV文件读取

Golang如何将Google表格作为CSV文件读取 今天我需要读取一个Google Sheets文件,将其作为在线CSV文件使用,而无需下载文件的离线副本。我找到了以下解决方案,并希望与社区分享。

  1. 在Google Sheets中:
    • 将目标表格发布为CSV文件,使用 文件 -> 发布到网络,确保选中“在更改时自动重新发布”选项。
    • 复制Google Sheets为CSV连接提供的链接。

Untitled

  1. 在Go语言中:
    • 使用以下代码:
// file main.go
package main

import (
	"encoding/csv"
	"fmt"
	"net/http"
)

func readCSVFromURL(url string) ([][]string, error) {
	resp, err := http.Get(url)
	if err != nil {
		return nil, err
	}

	defer resp.Body.Close()
	reader := csv.NewReader(resp.Body)
	reader.Comma = ','
	data, err := reader.ReadAll()
	if err != nil {
		return nil, err
	}

	return data, nil
}

func main() {
	url := "https://docs.google.com/spreadsheets/d/e/xxxxxsingle=true&output=csv"
	data, err := readCSVFromURL(url)
	if err != nil {
		panic(err)
	}

	for idx, row := range data {
		// skip header
		if idx == 0 {
			continue
		}

		if idx == 6 {
			break
		}

		fmt.Println(row[2])
	}
}
//

更多关于Golang如何将Google表格作为CSV文件读取的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

已修复,感谢反馈

更多关于Golang如何将Google表格作为CSV文件读取的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个很好的解决方案,通过将Google Sheets发布为CSV并使用HTTP请求读取数据,确实可以避免下载本地副本。你的代码基本正确,但需要注意几个关键点:

  1. URL格式:从Google Sheets获取的链接需要确保是直接的CSV下载链接。通常格式为:

    https://docs.google.com/spreadsheets/d/{SHEET_ID}/export?format=csv
    

    或者使用你提到的发布链接,但需要确保链接正确。

  2. 错误处理:建议添加HTTP状态码检查。

  3. 性能优化:对于大型表格,使用ReadAll()可能消耗较多内存,可以考虑流式处理。

以下是改进后的示例代码:

package main

import (
	"encoding/csv"
	"fmt"
	"io"
	"net/http"
)

func readCSVFromURL(url string) ([][]string, error) {
	resp, err := http.Get(url)
	if err != nil {
		return nil, fmt.Errorf("HTTP请求失败: %w", err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return nil, fmt.Errorf("HTTP状态码错误: %d", resp.StatusCode)
	}

	reader := csv.NewReader(resp.Body)
	reader.Comma = ','
	reader.LazyQuotes = true // 处理引号转义

	return reader.ReadAll()
}

func streamCSVFromURL(url string, processRow func([]string) error) error {
	resp, err := http.Get(url)
	if err != nil {
		return fmt.Errorf("HTTP请求失败: %w", err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return fmt.Errorf("HTTP状态码错误: %d", resp.StatusCode)
	}

	reader := csv.NewReader(resp.Body)
	reader.Comma = ','
	reader.LazyQuotes = true

	// 跳过标题行
	if _, err := reader.Read(); err != nil {
		return fmt.Errorf("读取标题行失败: %w", err)
	}

	for {
		row, err := reader.Read()
		if err == io.EOF {
			break
		}
		if err != nil {
			return fmt.Errorf("读取CSV行失败: %w", err)
		}

		if err := processRow(row); err != nil {
			return fmt.Errorf("处理行失败: %w", err)
		}
	}

	return nil
}

func main() {
	// 示例1:读取所有数据
	url := "https://docs.google.com/spreadsheets/d/e/xxxxxsingle=true&output=csv"
	data, err := readCSVFromURL(url)
	if err != nil {
		panic(err)
	}

	for idx, row := range data {
		if idx == 0 {
			continue // 跳过标题
		}
		if idx >= 6 {
			break
		}
		fmt.Printf("行%d, 列2: %s\n", idx, row[2])
	}

	// 示例2:流式处理(适合大文件)
	fmt.Println("\n流式处理:")
	err = streamCSVFromURL(url, func(row []string) error {
		if len(row) > 2 {
			fmt.Println(row[2])
		}
		return nil
	})
	if err != nil {
		panic(err)
	}
}

关键改进:

  1. 添加了HTTP状态码检查
  2. 设置了LazyQuotes = true以处理CSV中的引号转义
  3. 提供了流式处理函数streamCSVFromURL,适合处理大型表格
  4. 改进了错误信息,便于调试

注意:确保Google Sheets的分享设置允许"知道链接的任何人"查看,否则需要处理认证。对于需要认证的私有表格,需要使用Google Sheets API和OAuth2。

回到顶部