mirror of
				https://github.com/therootcompany/golib.git
				synced 2025-10-30 20:52:53 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			180 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # gsheet2csv
 | |
| 
 | |
| [](https://pkg.go.dev/github.com/therootcompany/golib/io/transform/gsheet2csv)
 | |
| 
 | |
| A simple wrapper around `encoding/csv` to read Google Sheet CSVs from URL, or a given Reader.
 | |
| 
 | |
| This does surprisingly little - you should probably just handle the boilerplate yourself. However, these are the problems it solves for us:
 | |
| 
 | |
| - works with Google Sheet URLs, regardless of URL format
 | |
|    - Edit URL: <https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/edit?gid=0000000000#gid=0000000000>
 | |
|    - Share URL (Sheet 1): <https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/edit?usp=sharing>
 | |
|    - CSV Export URL: <https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/export?format=csv&usp=sharing&gid=0000000000>
 | |
|    - anything with a path like `/spreadsheets/d/{docid}/` and (optionally) a hash or query param like `gid={gid}`
 | |
| - can write out for import to gsheet (comments containing quotes or commas are quoted), \
 | |
|   or in RFC form (comments are never quoted, but values beginning with a comment character are)
 | |
| - swaps `\r` (Windows) for `\n` (Unix) and ensures trailing newline (a la `encoding/csv`)
 | |
| 
 | |
| Note:
 | |
| 
 | |
| - The Google Sheet must be shared to **Anyone with the link**.
 | |
| - Read and write in 'gsheet' style for reciprocity of comment handling
 | |
| - Be careful about single-column CSVs \
 | |
|   (all comment-like lines are comments, same as with `encoding/csv` and empty lines)
 | |
| 
 | |
| # Usage
 | |
| 
 | |
| Same as `encoding/csv` (embedded), but with two extra options:
 | |
| 
 | |
| ```go
 | |
| package main
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 
 | |
| 	"github.com/therootcompany/golib/io/transform/gsheet2csv"
 | |
| )
 | |
| 
 | |
| func main() {
 | |
| 	switch len(os.Args) {
 | |
| 	case 2:
 | |
| 		break
 | |
| 	case 1:
 | |
| 		fmt.Fprintf(os.Stderr, "Usage: %s <url>\n", os.Args[0])
 | |
| 		os.Exit(1)
 | |
| 	}
 | |
| 	urlOrPath := os.Args[1]
 | |
| 
 | |
| 	gsr := gsheet2csv.NewReaderFrom(urlOrPath)
 | |
| 	records, err := gsr.ReadAll()
 | |
| 	if err != nil {
 | |
| 		fmt.Fprintf(os.Stderr, "Error reading from %s: %v\n", gsr.URL, err)
 | |
| 		os.Exit(1)
 | |
| 	}
 | |
| 
 | |
| 	csvw := gsheet2csv.NewWriter(os.Stdout)
 | |
| 	csvw.Comment = gsr.Comment
 | |
| 	if err := csvw.WriteAll(records); err != nil {
 | |
| 		fmt.Fprintf(os.Stderr, "Error writing csv %v\n", err)
 | |
| 		os.Exit(1)
 | |
| 	}
 | |
| }
 | |
| ```
 | |
| 
 | |
| # CLI
 | |
| 
 | |
| There are a few convenience utilities:
 | |
| 
 | |
| - `gsheet2csv` (also `gsheet2tsv`)
 | |
| - `gsheet2env`
 | |
| 
 | |
| ## gsheet2csv
 | |
| 
 | |
| They're only slightly different from a direct export of a Google CSV in that they reformat comments and newlines.
 | |
| 
 | |
| The alterable behavior is almost exclusively for testing.
 | |
| 
 | |
| ### Installation
 | |
| 
 | |
| ```sh
 | |
| go get github.com/therootcompany/golib/io/transform/gsheet2csv
 | |
| ```
 | |
| 
 | |
| ### Usage
 | |
| 
 | |
| ```sh
 | |
| gsheet2csv -raw -o ./gsheet.csv 'https://docs.google.com/spreadsheets/...'
 | |
| 
 | |
| gsheet2csv -d '\t' --write-style 'gsheet' ./gsheet.csv > ./gsheet.tsv
 | |
| 
 | |
| gsheet2csv --strip-comments ./gsheet.csv > ./sheet.csv
 | |
| ```
 | |
| 
 | |
| ```text
 | |
| --raw               download without processing
 | |
| --print-ids         print ids to stdout without download
 | |
| --print-url         print url to stdout without downloading
 | |
| -o <filepath>       write records to file (default: stdout)
 | |
| -d                  field delimiter (for output)
 | |
| --read-delimiter    input field delimiter (for testing reciprocity)
 | |
| --crlf              write using CRLF (\r\n) as the record separator
 | |
| --comment '#'       treat lines starting with # as comments
 | |
| --strip-comments    ignore single-field data beginning with a comment character
 | |
| --read-style        'gsheet' (preserves comments as single-field records)
 | |
|                     or 'rfc' (ignore lines starting with comment character)
 | |
| --write-style       'gsheet' (quote single-field comments containing quotes or commas)
 | |
|                     or 'rfc' (only quote values starting with a comment character)
 | |
| ```
 | |
| 
 | |
| ### ASCII Delimiters
 | |
| 
 | |
| ```
 | |
| ,   comma
 | |
| \t  tab (or a normal tab)
 | |
|     space (just a normal space)
 | |
| :   colon
 | |
| ;   semicolon
 | |
| |   pipe
 | |
| ^_  unit separator
 | |
| ^^  record separator
 | |
| ^]  group separator
 | |
| ^\  file separator
 | |
| \f  form feed (also ^L)
 | |
| \v  vertical tab (also ^K)
 | |
| ```
 | |
| 
 | |
| ## gsheet2env
 | |
| 
 | |
| Converts a Google Sheet to an ENV file.
 | |
| 
 | |
| ### Installation
 | |
| 
 | |
| ```sh
 | |
| go get github.com/therootcompany/golib/io/transform/gsheet2env
 | |
| ```
 | |
| 
 | |
| ### Usage
 | |
| 
 | |
| ```sh
 | |
| gsheet2env --no-shebang --no-header --no-export ./fixtures/gsheet-env-readme.csv
 | |
| ```
 | |
| 
 | |
| ### Example
 | |
| 
 | |
| ```csv
 | |
| # DO NOT put SECRETS here. Anyone with a link can see this. Use for config ONLY!
 | |
| LOCAL_TIMEZONE,America/Denver,"Seatle PT, Denver MT, Arizona MST, Chicago CT, Detroit ET"
 | |
| 
 | |
| # to show that escapes are handled
 | |
| FIRST_LETTER,A,
 | |
| MONEY_SYMBOL,$,
 | |
| SINGLE_QUOTE,',
 | |
| DOUBLE_QUOTE,"""",
 | |
| 
 | |
| # to show that newlines are handled
 | |
| TRIFORCE,"wisdom
 | |
| courage
 | |
| power","Zelda
 | |
| Link
 | |
| Ganon"
 | |
| ```
 | |
| 
 | |
| ```sh
 | |
| # DO NOT put SECRETS here. Anyone with a link can see this. Use for config ONLY!
 | |
| # Seatle PT, Denver MT, Arizona MST, Chicago CT, Detroit ET
 | |
| LOCAL_TIMEZONE='America/Denver'
 | |
| # to show that escapes are handled
 | |
| FIRST_LETTER='A'
 | |
| MONEY_SYMBOL='$'
 | |
| SINGLE_QUOTE=''"'"''
 | |
| DOUBLE_QUOTE='"'
 | |
| # to show that newlines are handled
 | |
| # Zelda
 | |
| # Link
 | |
| # Ganon
 | |
| TRIFORCE='wisdom
 | |
| courage
 | |
| power'
 | |
| ```
 |