为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 文件读取只读取最后一行

Golang 文件读取只读取最后一行

Go
猛跑小猪 2021-10-11 13:26:04
所以我拿了一些公开的数据,看起来像这样——这是文件http://expirebox.com/download/b149b744768fb11aee9c5e26ad409bcc.html,,,% of Total Expenditure,,,Function Code,Type of Activity,Expenditure,Dollars/Student (ADA),"This District (ADA 49,497)",All Unified School Districts,Statewide Average1000-1999ÊÊ,INSTRUCTIONÊÊ,"$249,397,226","$5,039",42%,62%,62%1000,Instruction,"$247,472,790ÊÊ","$5,000",42%,48%,49%1110,Special Education: Separate Classes,"$1,004,074",$20,N/A,N/A,N/A1120,Special Education: Resource Specialist Instruction,"$781,629",$16,N/A,N/A,N/A1130,Special Education: Supplemental Aids & Services in Regular Classrooms,"$46,747",$1,N/A,N/A,N/A1180,Special Education:  Nonpublic Agencies/Schools (NPA/S),N/A,N/A,N/A,N/A,N/A1190,Special Education:  Other Specialized Instructional Services,"$91,985",$2,N/A,N/A,N/A1100-1199,Instruction - Special Education,"$1,924,436ÊÊ",$39,0%,14%,13%它在一个csv中。我试过这个代码file, err := os.Open("expenses.csv")if err != nil {    log.Fatal(err)}defer file.Close()scanner := bufio.NewScanner(file)for scanner.Scan() {    fmt.Println(scanner.Text())}if err := scanner.Err(); err != nil {    log.Fatal(err)}和这个content, err := ioutil.ReadFile("expenses.csv")lines := strings.Split(string(content), "\n")fmt.Println(lines)check(err)dat, err := os.Open("expenses.csv")check(err)defer dat.Close()reader := csv.NewReader(dat)reader.LazyQuotes = truereader.FieldsPerRecord = -1rawCSVData, err := reader.ReadAll()check(err)fmt.Println(rawCSVData)for _, each := range rawCSVData {    fmt.Println(each)}检查在哪里func check(e error) {    if e != nil {        panic(e)    }}在这两种情况下,我都得到了这个结果 -"Total Expenditures, All Activities",,"$594,788,926","$12,017",100%,100%,100%,1%15%,4%,4%AA,N/A,N/Anified School Districts,Statewide Average而不是所有的行。为什么我只看最后一行?
查看完整描述

1 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

基本问题是这个文件有\r行尾。它也不是有效的 UTF-8。总之,这些都会造成Scanner很多麻烦。


首先,我们可以使用 xxd


00000000: 2c2c 2c25 206f 6620 546f 7461 6c20 4578  ,,,% of Total Ex

00000010: 7065 6e64 6974 7572 652c 2c2c 0d46 756e  penditure,,,.Fun

如果你看,你会看到行结尾是0d,也就是\r。Scanner需要它是\r\n或\n。


接下来,您可能会遇到麻烦,因为它不是 UTF-8。Ê那里的所有内容都是 real 0xCA,这不是有效的 UTF-8 编码。我们可以xxd再次看到:


000000b0: 3939 39ca ca2c 494e 5354 5255 4354 494f  999..,INSTRUCTIO

000000c0: 4eca ca2c 2224 3234 392c 3339 372c 3232  N..,"$249,397,22

Go 可能只会将它作为字节(和 get Ê)发送,这是许多编辑器尝试做的事情,但它可能会引起麻烦。


如果可能,请重新格式化此文件以使用 UTF-8 中的 Unix 或 Windows 行结尾。


查看完整回答
反对 回复 2021-10-11
  • 1 回答
  • 0 关注
  • 856 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信