如何在 Golang 中逐詞讀取檔案?
在 Go 中處理檔案時,經常需要逐詞讀取檔案。在本文中,我們將探討如何在 Golang 中逐詞讀取檔案。我們將討論完成此任務的三種不同方法,並提供程式碼片段來演示每種方法。
方法 1:使用 bufio.NewScanner
第一種方法是使用 bufio 包及其 NewScanner 函式逐詞讀取檔案。此函式將 io.Reader 介面作為輸入,並返回一個 Scanner 物件,該物件可用於逐詞掃描檔案。
示例
這是一個演示此方法的示例程式碼片段:
package main import ( "bufio" "fmt" "os" ) func main() { file, err := os.Open("filename.txt") if err != nil { panic(err) } defer file.Close() scanner := bufio.NewScanner(file) // Set the split function for the scanning operation. scanner.Split(bufio.ScanWords) // Scan all words from the file. for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { panic(err) } }
在此示例中,我們首先使用 os 包開啟檔案並檢查錯誤。然後,我們使用 bufio 包建立一個新的掃描器,並將 split 函式設定為 bufio.ScanWords 以逐詞讀取檔案。最後,我們遍歷每個單詞並將其列印到控制檯。
方法 2:使用 fmt.Fscanf
第二種方法是使用 fmt 包及其 Fscanf 函式逐詞讀取檔案。此函式將 io.Reader 介面作為輸入,並返回成功掃描的專案數。
示例
這是一個演示此方法的示例程式碼片段:
package main import ( "fmt" "os" ) func main() { file, err := os.Open("filename.txt") if err != nil { panic(err) } defer file.Close() var word string for { _, err := fmt.Fscanf(file, "%s", &word) if err != nil { break } fmt.Println(word) } }
在此示例中,我們首先使用 os 包開啟檔案並檢查錯誤。然後,我們建立一個名為 word 的變數,並使用 fmt.Fscanf 函式迴圈遍歷檔案,直到檔案結束。該函式掃描檔案以查詢下一個單詞並將其儲存在 word 變數中,然後我們將其列印到控制檯。
方法 3:使用 bufio.NewReader 和 strings.Fields
第三種方法是使用 bufio 包及其 NewReader 函式以及 strings 包及其 Fields 函式逐詞讀取檔案。NewReader 函式建立一個新的緩衝讀取器,而 Fields 函式將字串拆分為單詞。
示例
這是一個演示此方法的示例程式碼片段:
package main import ( "bufio" "fmt" "os" "strings" ) func main() { file, err := os.Open("filename.txt") if err != nil { panic(err) } defer file.Close() reader := bufio.NewReader(file) for { line, err := reader.ReadString('\n') if err != nil { break } words := strings.Fields(line) for _, word := range words { fmt.Println(word) } } }
在此示例中,我們首先使用 os 包開啟檔案並檢查錯誤。然後,我們使用 bufio 包建立一個新的讀取器,並使用 reader.ReadString 函式迴圈遍歷檔案中的每一行。該函式讀取檔案中的每一行,直到遇到換行符(\n),並將該行作為字串返回。
但是,如果我們想逐詞讀取檔案,則需要將每一行拆分為單詞。為此,我們可以使用 Go 中的 strings 包。
示例
讓我們看看如何在 Go 中逐詞讀取檔案的示例:
package main import ( "bufio" "fmt" "os" ) func main() { file, err := os.Open("test.txt") if err != nil { panic(err) } defer file.Close() scanner := bufio.NewScanner(file) scanner.Split(bufio.ScanWords) for scanner.Scan() { word := scanner.Text() fmt.Println(word) } if err := scanner.Err(); err != nil { panic(err) } }
在上面的示例中,我們首先使用 os 包開啟檔案並檢查錯誤。然後,我們使用 bufio 包建立一個新的掃描器,並將其 split 函式設定為 bufio.ScanWords。這告訴掃描器將輸入拆分為單詞。
接下來,我們使用 scanner.Scan() 函式迴圈遍歷檔案中的每個單詞,該函式讀取輸入中的下一個單詞,如果成功則返回 true。然後,我們使用 scanner.Text() 函式獲取單詞並將其列印到控制檯。
最後,我們使用 scanner.Err() 函式檢查是否有任何錯誤。
結論
使用 bufio 包和 strings 包,在 Go 中逐詞讀取檔案非常容易。透過使用 bufio.ScanWords 函式,我們可以將輸入拆分為單詞並迴圈遍歷檔案中的每個單詞。