Skip to content

Instantly share code, notes, and snippets.

@lazywhite
Last active April 22, 2022 06:41
Show Gist options
  • Save lazywhite/9641c1e2e45df1f31dcc8a37fc646e17 to your computer and use it in GitHub Desktop.
Save lazywhite/9641c1e2e45df1f31dcc8a37fc646e17 to your computer and use it in GitHub Desktop.
parse csv
package main
import (
"fmt"
)
/*
输入文件构成规则如下:
1. 每行代表一条记录,字段之间以逗号(,)分隔
2. 若字段内容包含逗号(,),则以双引号包围该字段
3. 若字段内容包含双引号("),则以双引号包围该字段,字段内的双引号由一个变两个
请参照上面三条规则,编写一个解析程序,将解析后的记录内容按行输出,字段之间以TAB(\t)分隔,2小时内完成
示例:
John,33,"足球,摄影",New York
John,33,"足球,""摄影",New York
输出:
John 33 足球,摄影 New York
John 33 足球,"摄影 New York
输入:
2,John,45,"足球,摄影",New York
3,Carter Job,33,"""健身"",远足","河北,石家庄"
4,Steve,33,"大屏幕164""","DC""Home"""
5,"Jul,y",33,Football,Canada
求输出!
*/
func main() {
input := []byte(`2,John,45,"足球,摄影",New York
3,Carter Job,33,"""健身"",远足","河北,石家庄"
4,Steve,33,"大屏幕164""","DC""Home"""
5,"Jul,y",33,Football,Canada`)
parseCsv(input)
fmt.Println(string(input))
}
func parseCsv(input []byte) {
quote := 0
for i := range input {
char := input[i]
if char == ',' {
if quote == 0 {
input[i] = '\t'
}
}
if char == '"' {
if quote == 0 {
quote++
} else {
quote--
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment