使用R筛选txt中以特定字符结尾的行并生成新txt
关键词:R语言文件处理; R语言文字处理; R语言正则匹配; R语言处理txt文件;
本来是想用R处理特定字符开头的行,但没有成功,当时已经觉得没戏了,R处理不了这个活,都要转去matlab/octave了,后来突然想到我要筛选的文件不光开头相同,结尾也相同啊!只是中间不同!!
教训:正则表达式还没系统学习过,遇到问题只能先百度而不是先编程。对于R我果然还是新手。。
需要处理的txt文件(节选)
$ gy - Calling globals.c
$ gy - Calling [title_masked].c
$ gy - Calling [title_masked].c
$ gy - Calling [title_masked].c
$ gy - Calling [title_masked].c
$ gy - Calling [title_masked].c
$ gy - Calling [title_masked].c
$ gy - Calling [title_masked].c
$ gy - Calling [title_masked].c
$ gy - Calling common.c
$ gy - Calling common.c
$ gy - Calling common.c
$ gy - Calling common.c
$ gy - Calling [title_masked].c
$ gy - Calling common.c
$ gy - Calling common.c
$ gy - Calling common.c
......
//omitted
......
$ gy - Calling [title_masked].c
----------------------------------------------------------------
* starting from the following network:
[masked]/[top secret sh*t] [masked] [also masked]
model:
$ gy - Calling [title_masked].c
$ gy - Calling common.c
......
//omitted
......
$ gy - Calling common.c
[A][B][C][D][E][F]
nodes: 6
arcs: 0
undirected arcs: 0
directed arcs: 0
average markov blanket size: 0.00
average neighbourhood size: 0.00
average branching factor: 0.00
generation algorithm: Empty
* current score: -1548.193
* whitelisted arcs are:
* blacklisted arcs are:
$ gy - Calling [title_masked].c
$ gy - Calling [title_masked].c
$ gy - Calling [title_masked].c
$ gy - Calling common.c
$ gy - Calling common.c
$ gy - Calling common.c
$ gy - Calling common.c
$ gy - Calling common.c
$ gy - Calling common.c
$ gy - Calling common.c
$ gy - Calling common.c
$ gy - Calling [title_masked].c
$ gy - Calling [title_masked].c
* caching score delta for arc A -> B (4.135076).
$ gy - Calling [title_masked].c
$ gy - Calling common.c
$ gy - Calling common.c
......
//omitted
......
我要筛选的就是以$ gy -
开头的行,但换位思考,我要找的同时也是.c
结尾的行。检查结尾什么的,R还是可以干的~
使用的方法
sink("result.txt")
src.txt<-read.csv("[masked]_output_about_[masked]_R.txt",header = FALSE)
src.txt[grep(pattern="\\.c",src.txt[,1]),]
sink()
为什么不使用read.table? 因为报错,我估计我的txt文件并不能被很标准地识别为有规整列的表格,于是我突发奇想为什么不把每一> 行都作为一个表格呢,这样就是一个n行1列的大表格啊
于是就使用了read.csv,别说 效果还不错~
最终得到的result.txt
[1] $ gy - Calling globals.c $ gy - Calling [title_masked].c
[3] $ gy - Calling [title_masked].c $ gy - Calling [title_masked].c
[5] $ gy - Calling [title_masked].c $ gy - Calling [title_masked].c
[7] $ gy - Calling [title_masked].c $ gy - Calling [title_masked].c
[9] $ gy - Calling [title_masked].c $ gy - Calling common.c
[11] $ gy - Calling common.c $ gy - Calling common.c
[13] $ gy - Calling common.c $ gy - Calling [title_masked].c
[15] $ gy - Calling common.c $ gy - Calling common.c
[17] $ gy - Calling common.c $ gy - Calling [title_masked].c
[19] $ gy - Calling common.c $ gy - Calling common.c
[21] $ gy - Calling common.c $ gy - Calling [title_masked].c
[23] $ gy - Calling common.c $ gy - Calling common.c
[25] $ gy - Calling common.c $ gy - Calling [title_masked].c
[27] $ gy - Calling common.c $ gy - Calling common.c
[29] $ gy - Calling common.c $ gy - Calling [title_masked].c
[31] $ gy - Calling common.c $ gy - Calling common.c
[33] $ gy - Calling common.c $ gy - Calling [title_masked].c
......
//omitted
......
效果还是不错的,起码节省了一点时间,接下来还需要去除相同项,这个我还没搞。还需要想想怎么做,用不用R做。
其实VS Code已经提供了更改所有匹配项的功能,如果图省事我完全可以直接用的,but for the sake of learning R, I’d like to give it a try.
附上一个小彩蛋:我刚才快放弃用R的时候在网上找的matlab代码
吐槽:果然网上找的不可靠虽然思路是对的但是处理我的文件的时候有bug –不能有无字符的行(即这行就是空的,最多一个回车符)
所以我还得手动把原文件里面所以空着的行删掉。不过也不是没有好处,输出个格式起码控制在一行一句了,但我估计R这块也是可以设置的吧。不过总算弄好了,最终选择出来的行跟R是一样的,只是格式不同罢了
diary('[path_masked]\use_matlab_result.txt');
diary on;
clc;
file = '[path_masked]\src.txt';
fid = fopen(file,'r');
disp(['Reading file: ',file]);
linenumber = 0;
while ~feof(fid)
linenumber = linenumber + 1;
line = fgetl(fid);
if(line(1:7) == '$ gy - ')
disp([num2str(linenumber),':',line]);
end
end
diary off; %%类比R中的sink()
输出结果:
Reading file: [path_masked]\src.txt
1:$ gy - Calling globals.c
2:$ gy - Calling [title_masked].c
3:$ gy - Calling [title_masked].c
4:$ gy - Calling [title_masked].c
5:$ gy - Calling [title_masked].c
6:$ gy - Calling [title_masked].c
7:$ gy - Calling [title_masked].c
8:$ gy - Calling [title_masked].c
9:$ gy - Calling [title_masked].c
10:$ gy - Calling common.c
11:$ gy - Calling common.c
12:$ gy - Calling common.c
13:$ gy - Calling common.c
14:$ gy - Calling [title_masked].c
15:$ gy - Calling common.c
16:$ gy - Calling common.c
17:$ gy - Calling common.c
18:$ gy - Calling [title_masked].c
......
//omitted
......
34:$ gy - Calling [title_masked].c
39:$ gy - Calling [title_masked].c
40:$ gy - Calling common.c
......
//omitted
......
或者在matlab代码中加入else disp(‘not match!’);
输出:
......
//omitted
......
31:$ gy - Calling common.c
32:$ gy - Calling common.c
33:$ gy - Calling common.c
34:$ gy - Calling [title_masked].c
not match!
not match!
not match!
not match!
39:$ gy - Calling [title_masked].c
40:$ gy - Calling common.c
......
//omitted
......
然而R只需要3行代码:P
visitor tracker