gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:10:56 28 4
gpt4 key购买 nike

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

12341|银行|234225

135543|单例\|办公室|25343452

7897|办公室|80909

25223|银行|9870

我希望第二行第二列的观察结果显示为“单例|办公室”。

保持 |并不重要。如果我可以完全忽略\|,或将其替换为另一个字符(例如“/”),我也可以接受。即“singleoffice”或“single/office”都可以。

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

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

最佳答案

这里有两种不同的尝试方法:

1) 重新阅读 试试看文件大小是否允许这样做。它使用 readLines 读取文件,删除\|字符并重新读取它:

read.table(text = gsub("\\|", "", readLines("myfile.dat"), fixed = TRUE), sep = "|")

2) sqldf 这在卸载 R 的 sqlite 数据库中进行处理。它将数据读入名为 file 的 sqlite 表中,使用 删除指示的字符在内部选择中替换。向外移动下一个选择将每一行拆分为第一个字段和之后的所有内容,外部选择将此后的所有内容拆分为剩余的两个字段并将相关字段转换为数字。最后它被读入 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 - 在 R 中导入文本文件时如何忽略转义的分隔符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36190944/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com