如何忽略在R中导入文本文件时转义的分隔符?

时间:2016-03-23 23:54:53

标签: r

我尝试导入一个由|分隔的文本文件,使用" fread"在R.但是一些字符串包含转义版本的分隔符。例如:

12341 |银行| 234225

135543 |单一\ |办公室| 25343452

7897 |办公室| 80909

25223 |银行| 9870

我希望第二行,第二列的观察结果为"单一"。

保持|并不重要。如果我可以完全忽略\,或者用另一个角色替换它(例如" /"),我也可以这样做。即"单一办公室"或"单身/办公室"很好。

我需要在不使用shell命令的情况下执行此操作(没有" sed")。

在大文本文件(~20GB)中执行此操作的最快方法是什么?提前感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

尝试以下两种不同的可能性:

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