奇怪的正则表达式行为,可能带有换行符

时间:2016-09-02 20:37:05

标签: regex matlab file-format eol

我有一个由约100万行的乐器创建的csv数据文件。我正在Windows机器上的Matlab中创建一个GUI程序来分析这些数据。我需要检测数据的开始位置,因为文件以很多不同的实验数据开头。但是,在Matlab中使用文件交换中的grep实用程序返回错误的行号。所以我将文件复制到我的Mac上,发现内置的Unix实用程序有这种奇怪的行为。

不仅没有返回搜索词存在的整行;它还删除正则表达式或脚本应返回的行号!

我已将文件缩小为下面的一个小例子。这是奇怪的行为:

期望的结果:

11:   Synchronized blah blah some variable,30 ms
17: Synchronized beats for well A1:
  1. 删除行号,并删除行“A1井的同步节拍:”的开头:

    $ grep -n "Synchronized" example.csv 
    11:   Synchronized blah blah some variable,30 ms
    Time (s),var1,var2,var3,var4,Included In Statistics,var5,var6,var7,var8,var9
    
  2. 我写了一个Python脚本,它给出了相同的结果:

    $ python preprocessing.py 
    11 :    Synchronized blah blah some variable,30 ms
    
    Time (s),var1,var2,var3,var4,Included In Statistics,var5,var6,var7,var8,var9
    
  3. 这是Python脚本:

    file = 'example.csv'
    lineNum = 1
    with open(file,'r') as f: 
        for line in f: 
            if "Synchronized" in line:
                print lineNum, ":", line
            lineNum += 1
    
    1. 使用Matlab grep实用程序,看起来此行的开头有一个换行符。但是,它仍然可以识别出“同步”字样。

      [fl,p]=grep('-e','Synchronized','C:\Users\Traveler\Documents\20160825\example.csv')
      example.csv:    Synchronized blah blah some variable,30 ms
      example.csv: 
      Synchronized beats for well A1:
      Time (s),var1,var2,var3,var4,Included In Statistics,var5,var6,var7,var8,var9
      
    2. 顺便说一下,这也意味着当我想要检测以后的数据时,行号会相当多,因为这种类型的问题发生在多行上。

      所以我的问题:为什么会发生这种情况,我可以在Matlab程序的上下文中做些什么呢? (我可以构建任何东西,只要它可以在Matlab中调用,即因此不涉及此GUI的用户。)显然有一些我看不到的换行符问题,但删除怎么样?行号?我甚至不确定如何处理换行符。我无法一次将文件加载到Matlab内存中。

      示例数据文件:

      Investigator: 
      Experiment ID: 
      Description: 
      
      ,
      Some Settings,
         File Time,something
         Sampling Frequency,12.5 kHz
      ,
      Machine Settings,
         Synchronized blah blah some variable,30 ms
         Detection Method,Polynomial Regression
      ,
      ,
      
      
      Synchronized beats for well A1:
      Time (s),var1,var2,var3,var4,Included In Statistics,var5,var6,var7,var8,var9
      1,2,3,4,5,False,1,0,2,3,4
      2,3,4,5,6,False,2,0,3,4,5
      

1 个答案:

答案 0 :(得分:0)

Line ending conventions是令人讨厌的事情。它们是回车(CR,\ r,ASCII 13)和换行(LF,\ n,ASCII 10)的某种组合。 Windows约定是CR / LF。 Mac OSX是LF。你的乐器可能都不是。在我看来,至少你的一些行以一个简单的回车结束,用MATLAB(和许多其他语言)用\r生成。如果在UNIX-ish操作系统上输出一行文本后跟只有CR,则只会得到没有LF的CR,这意味着下一行文本将覆盖屏幕上的前一个 。 / p>

通过查看裸ASCII代码来检查文件。例如,在MATLAB中,您可以查看uint8(linestring)以了解会发生什么。然后,您可以使用外部实用程序修复文件,也可以使用MATLAB一次处理整个文件,修剪线或调整自己的行数以补偿您看到的任何内容。例如:

fid = fopen('file', 'rt');  % Note the t for text
linenum = 0;
while 1
    line = fgetl(fid);
    linenum = linenum + 1;
    if ~ischar(line), break, end
    disp(uint8(line));  % For debug, to see what's going on
    disp(line);
end
fclose(fid);

修复基本行读数和计数后,使用regexp或类似内容选择所需的行并直接处理。