如何在 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 函式,我們可以將輸入拆分為單詞並迴圈遍歷檔案中的每個單詞。
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP