如何在 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 函式,我們可以將輸入拆分為單詞並迴圈遍歷檔案中的每個單詞。

更新於: 2023年4月25日

575 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告