在 R 中逐行讀取文字檔案
Jesse John
2023年1月30日
2022年5月18日
使用 readLines()
函式很容易將純文字檔案讀入 R。結果是一個字元向量,其中每個元素都是一個字串,包括來自文字檔案的一行。
但是當我們不想將整個檔案載入到記憶體中時,我們需要一次一行地讀取和處理文字檔案。
R 中的連線是什麼
在 R 中,連線是類檔案物件的介面。
諸如 readLines()
之類的函式開啟一個連線,使用它並關閉它。它一次讀取整個檔案。
要順序讀取檔案,我們必須顯式開啟一個連線。為此,我們將使用 file()
函式。
我們將使用的選項如下。
description
代表檔名open
指定我們只想讀取檔案blocking = TRUE
在 R 中使用 readLines()
函式逐行讀取文字檔案
只要讀取行,我們就會使用 readLines()
函式。因為我們不知道行數,所以我們需要知道何時到達檔案末尾。
當檔案中沒有更多行時,readLines()
函式返回一個空字元向量 character(0)
。
此時,我們將使用 break
退出迴圈。請注意,迴圈不會在空行處中斷,因為它們具有行尾標記。
我們將在每次迴圈迭代中使用 identical()
函式來檢查該行是否與 character(0)
相同。
如果是,我們 break
;否則,我們處理該行。在示例中,我們將其列印出來。
根據文件,文字檔案的最後一行應該有一個行尾標記,以便 readLines()
函式能夠始終如一地工作。
首先,用以下文字建立一個純文字檔案,並用 UTF-8 編碼和合適的檔名儲存(我們需要相應地替換程式碼中的檔名)。
The first line.
The second line.
The third line.
Last line.
在示例程式碼中,我們將執行以下操作。
- 建立一個連線並開啟它。
- 迴圈遍歷檔案,一次一行,列印它。
- 當行是
character(0)
時退出迴圈。 - 關閉連線。顯式開啟的連線需要顯式關閉。
示例程式碼:
# Explicitly create and and open a connection.
# REPLACE THE FILE NAME AS PER YOUR FILE.
myCon = file(description = "filename.txt", open="r", blocking = TRUE)
# The position in the connection advances to the next line on each iteration.
# Loop till the line is the empty vector, character(0).
repeat{
pl = readLines(myCon, n = 1) # Read one line from the connection.
if(identical(pl, character(0))){break} # If the line is empty, exit.
print(pl) # Otherwise, print and repeat next iteration.
}
# Explicitly opened connection needs to be explicitly closed.
close(myCon)
rm(myCon) # Removes the connection object from memory.
參考和幫助
請參閱 R 資料匯入/匯出手冊 的第 7 節。
此外,請參閱 connections
或 file
和 readLines
的文件。
Author: Jesse John