这个问题与以下问题有关:
How to parse tab-delimited data (of different formats) into a data.table/data.frame?
我有一个格式错误的文本文件,其中以制表符分隔的格式如下:
A 1092 - 1093 + 1X
B 1093 HRDCPMRFYT
A 1093 + 1094 - 1X
B 1094 BSZSDFJRVF
A 1094 + 1095 + 1X
B 1095 SSTFCLEPVV
...
但是,文本文件中有几行长行,它们在技术上以制表符分隔,但都是长字符串。例如这里的“Z”和“Y”行
Z FX:E:4.2
Y 23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M
A 1092 - 1093 + 1X
B 1093 HRDCPMRFYT
A 1093 + 1094 - 1X
B 1094 BSZSDFJRVF
A 1094 + 1095 + 1X
B 1095 SSTFCLEPVV
...
该文本文件的一部分是
Y 23434M,23434M,...
可能有几 GB 长。这些行非常罕见,仅用前面的
Z
标记。或 Y
.我目前在文本编辑器中打开了该文件并删除了这些行。然而,这在算法上是不合理的。有没有办法解析这个文件,使得 (1) 只有行
A
和 B
使用或 (2) 行 Z
和 Y
明确没有使用?编辑:澄清一下,Z 不是一个长字符串。这里只有“Y”是一个长字符串。是格式为
X XX:X:0.0
的字符串, 由此 X
是一个字符和 0
一个整数。
最佳答案
您可以使用系统调用来修复文件,例如 sed
,按一定的模式。如果要删除所有以 Z
开头的行或 Y
你可以简单地传递一个正则表达式,后跟 /d
system("sed -i '/^[ZY]/d' test.tab")
上面的命令将从您的文件中删除所有以 Z 或 Y 开头的行。然后,您可以运行我在上一个问题中发布的相同代码
library(data.table)
fread("sed '$!N;s/\\n/ /' test.tab")
# V1 V2 V3 V4 V5 V6 V7 V8
# 1: A 1092 - 1093 + 1X B 1093 HRDCPMRFYT
# 2: A 1093 + 1094 - 1X B 1094 BSZSDFJRVF
# 3: A 1094 + 1095 + 1X B 1095 SSTFCLEPVV
数据
text <- "Z FX:E:4.2
Y 23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M,23434M
A 1092 - 1093 + 1X
B 1093 HRDCPMRFYT
A 1093 + 1094 - 1X
B 1094 BSZSDFJRVF
A 1094 + 1095 + 1X
B 1095 SSTFCLEPVV"
# Saving it as tab separated file on disk
write(gsub(" +", "\t", text), file = "test.tab")
关于r - 将制表符分隔的数据解析为 R data.table/data.frame 时如何排除某些行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50316300/