我開始學習Go,當使用ioutil.ReadFile函數時,我對包含EOF的事實感到有些困惑。例如,我想要讀取文件並解析字段分隔符上的所有行。防止讀取文件或ReadAll讀取EOF
示例輸入文件:
CZG;KCZG;some text
EKY;KEKY;some text
A50;KA50;some text
UKY;UCFL;some text
MIC;KMIC;some text
K2M;K23M;some text
這是我做的讀取和解析該文件的內容:
import(
"fmt"
"log"
"io/ioutil"
"strings"
)
func main() {
/* Read file */
airportsFile := "/path/to/file/ad_iata"
content, err := ioutil.ReadFile(airportsFile)
if err != nil {
log.Fatal(err)
}
/* split content on EOL */
lines := strings.Split(string(content), "\n")
/* split line on field separator ; */
for _, line := range lines {
lineSplit := strings.Split(line, ";")
fmt.Println(lineSplit)
}
}
的string.Split功能在lineSplit片的末尾添加一個空元素時,看到的EOF(沒有解析)。因此,如果我想訪問該切片的第二個索引(lineSplit[1]
),我會遇到panic: runtime error: index out of range
。我必須通過這樣做來限制範圍
/* split line on field separator ; */
lenLines := len(lines) -1
for _, line := range lines[:lenLines] {
lineSplit := strings.Split(line, ";")
fmt.Println(lineSplit[1])
}
如果我想繼續使用ReadFile的簡潔性,還有更好的方法嗎?使用ioutil.ReadAll
在文件末尾沒有尾部的\ n。 'bufio.Scanner'的解決方案確實很好,但我只是想知道是否有一個選項可以防止ioutil.ReadFile在看到EOF時添加一個空片段。如果沒有,我會使用bufio。謝謝。 – ripat
你是如何確認沒有尾隨換行符的?有些編輯實際上並沒有將這些顯示爲空行,而是無聲地添加它們。嘗試'od -tc/path/to/file/ad_iata'並查看。 – Thomas
我站好了。最後一行末尾有一個尾部的\ n。這使得'ioutil.ReadFile'的行爲更符合我的邏輯。我從你身上學到了一些答案。再次感謝。 – ripat