下面是兩種不同的可能性,嘗試:
1)重讀試試這個,看看文件的大小允許這樣做。它使用readLines
讀入文件,刪除\ |字符和重新讀取它:
read.table(text = gsub("\\|", "", readLines("myfile.dat"), fixed = TRUE), sep = "|")
2)sqldf這確實在SQLite數據庫卸載R.它的數據讀入名爲file
一個SQLite表的處理,消除在所述內使用replace
所指示的字符選擇。向外移動時,下一個選擇將每行分割爲第一個字段和其後的所有內容,而外部選擇將所有內容分割到其餘兩個字段中,並將相關字段轉換爲數字。最後它被讀入R.除了讀入R的最後一步發生在R之外,R的限制將不適用。
library(sqldf)
read.csv.sql("myfile.dat", header = FALSE, sql =
"select cast(V1 as numeric) V1,
substr(V2, 1, instr(V2, '|') - 1) V2,
cast(substr(V2, instr(V2, '|') + 1) as numeric) V3
from (select substr(V1, 1, instr(V1, '|') - 1) V1,
substr(V1, instr(V1, '|') + 1) V2
from (select replace(V1, '\\|', '') V1 from file))")
3)sqldf - 2使用sqldf在SQL更換分隔符的數據這一個讀取,以避免作爲R做它,然後將其讀入R.然後將其寫入到一個文件,並讀取它又回來了。這個?應該用沒有出現在文件中的任何字符替換。如果空間有限,您可能希望取消註釋rm()
。
library(sqldf)
dat <- read.csv.sql("myfile.dat", sep = "?", header = FALSE,
sql = "select replace(V1, '\\|', '') V1 from file")
write.table(dat, file = "myfile2.dat", sep = "?", row.names = FALSE, quote = FALSE)
# rm(dat)
read.table("myfile2.dat", sep = "|", skip = 1)
注:(1)以下是一些自包含上述的可再現的運行:
Lines <- "12341|bank|234225
135543|single\\|office|25343452
7897|office|80909
25223|bank|9870"
cat(Lines, "\n", file = "myfile.dat")
read.table(text = gsub("\\|", "", readLines("myfile.dat"), fixed = TRUE), sep = "|")
,並提供:
V1 V2 V3
1 12341 bank 234225
2 135543 singleoffice 25343452
3 7897 office 80909
4 25223 bank 9870
(2)和
Lines <- "12341|bank|234225
135543|single\\|office|25343452
7897|office|80909
25223|bank|9870"
cat(Lines, "\n", file = "myfile.dat")
library(sqldf)
read.csv.sql("myfile.dat", header = FALSE, sql =
"select cast(V1 as numeric) V1,
substr(V2, 1, instr(V2, '|') - 1) V2,
cast(substr(V2, instr(V2, '|') + 1) as numeric) V3
from (select substr(V1, 1, instr(V1, '|') - 1) V1,
substr(V1, instr(V1, '|') + 1) V2
from (select replace(V1, '\\|', '') V1 from file))")
,並提供:
V1 V2 V3
1 12341 bank 234225
2 135543 singleoffice 25343452
3 7897 office 80909
4 25223 bank 9870
(3)和
Lines <- "12341|bank|234225
135543|single\\|office|25343452
7897|office|80909
25223|bank|9870"
cat(Lines, "\n", file = "myfile.dat")
library(sqldf)
dat <- read.csv.sql("myfile.dat", sep = "?", header = FALSE,
sql = "select replace(V1, '\\|', '') V1 from file")
write.table(dat, file = "myfile2.dat", sep = "?", row.names = FALSE, quote = FALSE)
# rm(dat)
read.table("myfile2.dat", sep = "|", skip = 1)
,並提供:
V1 V2 V3
1 12341 bank 234225
2 135543 singleoffice 25343452
3 7897 office 80909
4 25223 bank 9870
當你在數據讀取方面會發生什麼? R是否將轉義的分隔符標識爲分隔符,並將上一個值作爲新行創建? – cgage
我得到這個錯誤: 「期待36列,但第471行包含處理所有列後的文本。很可能這是由於一個或多個字段已嵌入sep ='|'和/或(非轉義的)'\ n'字符在不平衡的未轉義的引號內,fread無法處理這些不明確的情況,並且這些行可能沒有按預期讀入,請閱讀fread中的引號部分。 – Max