R_处理我的一个txt文件的一点心得

使用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
访客追踪插件


你可能感兴趣的:(学习笔记,R)