我有一個問題,我正在讀取大 ( 500mb) CSV 檔案,然后想驗證是否已正確讀取所有資料。為此,我一直在使用 readLines() 的 length() 和 read.csv2 的 nrow() 之間的比較。
以下是我的 R 代碼:
df <- readFileFromServer(HOST, KEY,
paste0(SERVER_PATH, SERVER_FOLDER),
FILENAME,
FUN = read.csv2,
sep = ";",
quote = "", encoding = "UTF-8", skipNul = TRUE)
df_check <- readFileFromServer(HOST, KEY,
paste0(SERVER_PATH, SERVER_FOLDER),
FILENAME,
FUN = readLines,skipNul = TRUE)`
然后我通過檢查來驗證是否已加載所有資料:
if(nrow(df) != (length(df_check) - dif)){
stop("some error msg")
}
dif設定為 1,以說明 CSV 檔案中的標頭。此檢查是給定 CSV 檔案失敗的部分。到目前為止,這一直按預期作業,但現在這項檢查導致了問題,但我無法完全理解原因。
檢查失敗的一個 CSV 檔案在資料中有“NULL”,我相信 readLines 將其解釋為分隔符,從而導致換行,然后檢查失敗,但我真的不確定。我嘗試將不同的引數決議為我的 readfunctions,但問題仍然存在。
我希望 readlines 和 read.csv2 分別產生相同的 length()-1 和 nrow(),如我的代碼片段所示。
uj5u.com熱心網友回復:
這不是一個正確的答案,但評論時間太長了。這將是我的除錯策略。
- 選擇一個失敗的檔案。用 readLines 吞噬它。
- 使用 writeLines 在本地保存檔案。
- 您的第一項作業是確保在從磁盤加載檔案時檢查也失敗。我的第一個想法是第一次運行的檔案傳輸
readFilesFromServer和第二次運行的檔案傳輸并不完全相同。
現在。如果當您使用 read.csv 在本地讀取給定檔案時問題仍然存在(行數與 readLine 輸出中的行數不同),您的作業將變得更容易(并且可能更快)解決。
首先,查看 CSV 檔案的開頭和結尾。他們是應該的嗎?它們是否匹配資料框頭部和尾部的資料?如果是,那么您需要系統地查找缺失的行。
由于 CSV 只是逗號分隔的檔案,您可以將從 CSV 檔案中讀取的每一行readLines與該行進行比較,因為它應該基于您使用read.csv. 這應該如何完成取決于您的原始 csv 檔案的外觀(是否需要插入引號等)。基本上,您需要找出一種從資料框中的資料恢復 CSV 檔案行的方法,然后尋找不同的第一行。
這是一些代碼,可以讓您了解我的意思:
## first, prepare data – for this example only!
f <- file("test.csv", "w")
writeLines(c("a,b,c", "1,what ever,42", "12,89,one"), f)
close(f)
## actual test
## first, read the file with readlines
f <- file("test.csv", "r")
rl <- readLines(f)
close(f)
## then, read it with test.csv
csv <- read.csv("test.csv")
## third, prepare the lines as they should look based on the CSV
rl_sim <- do.call(paste, c(csv, sep=","))
## find the first mismatch
for(i in 1:length(rl_sim)) {
if(rl_sim[i] != rl[i 1]) {
message("Problems start at line ", i, "\n", rl_sim[i], rl[i 1])
break
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/534897.html
上一篇:替換資料框中的多個字串
下一篇:如何將csv轉換為json
