/*
请完成以下任务:
在此Pad中完成代码,不要将代码复制到外部IDE中。
在完成面试后,请点击右下角的「End Interview」按钮。
输入字符的规则:
每行表示一条记录,字段之间以逗号(,)分隔。
段需要用双引如果字段内容包含逗号(,),则该字段需要用双引号(")包裹。
如果字段内容包含双引号("),则该字号包裹,并且字段内的每个双引号需要转义为两个双引号("")。
编写解析程序,将解析后的内容按行输出,字段之间以制表符(\t)分隔。
例子:
输入:Cindy,47,"收藏,""爬山",New Task
输出:Cindy 47 收藏,"爬山 New Task"
*/
package main
import (
"fmt"
"strings"
)
func main() {
rows := `Cindy,47,"收藏,""爬山",New Task`
execute(rows)
}
func execute(rows string) {
msum := 0
num := len([]rune(rows))
out := make([]string, 0, 200)
stemp := ""
lenStemp := 0
for i := 0; i < num; i++ {
lenStemp = len(stemp)
if string([]rune(rows)[i]) == "," && msum == 0 {
out = append(out, stemp)
stemp = ""
} else if string([]rune(rows)[i]) == "\"" {
if stemp == "" {
stemp = "%" // 用%代替
msum += 1
} else {
if stemp[lenStemp-1:] == "*" {
stemp = stemp[:lenStemp-1] + "\""
msum -= 1
} else {
stemp = stemp + "*" // 用*代替
msum += 1
}
}
} else if string([]rune(rows)[i]) == "," && msum == 2 && stemp[lenStemp-1:] == "*" {
out = append(out, stemp[1:lenStemp-1]+"\"")
stemp, msum = "", 0
} else {
stemp = stemp + string([]rune(rows)[i])
}
}
if string([]rune(stemp)[0]) == "%" {
out = append(out, stemp[1:lenStemp-1])
} else {
out = append(out, stemp)
}
joinStr := strings.Join(out, "\t")
fmt.Println(joinStr)
}
欢迎大家指正