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

所以我拿了一些公开的数据,看起来像这样——


这是文件


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 Average

1000-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/A

1120,Special Education: Resource Specialist Instruction,"$781,629",$16,N/A,N/A,N/A

1130,Special Education: Supplemental Aids & Services in Regular Classrooms,"$46,747",$1,N/A,N/A,N/A

1180,Special Education:  Nonpublic Agencies/Schools (NPA/S),N/A,N/A,N/A,N/A,N/A

1190,Special Education:  Other Specialized Instructional Services,"$91,985",$2,N/A,N/A,N/A

1100-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 = true


reader.FieldsPerRecord = -1


rawCSVData, 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

而不是所有的行。


为什么我只看最后一行?


猛跑小猪
浏览 857回答 1
1回答

梦里花落0921

基本问题是这个文件有\r行尾。它也不是有效的 UTF-8。总之,这些都会造成Scanner很多麻烦。首先,我们可以使用 xxd00000000: 2c2c 2c25 206f 6620 546f 7461 6c20 4578  ,,,% of Total Ex00000010: 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..,INSTRUCTIO000000c0: 4eca ca2c 2224 3234 392c 3339 372c 3232  N..,"$249,397,22Go 可能只会将它作为字节(和 get Ê)发送,这是许多编辑器尝试做的事情,但它可能会引起麻烦。如果可能,请重新格式化此文件以使用 UTF-8 中的 Unix 或 Windows 行结尾。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go