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

Strange regular expressions behavior, possibly with newlines

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

它不仅没有 return搜索词所在的整行;它还删除了正则表达式或脚本应该 return 的行号!

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

期望的结果:

11:   Synchronized blah blah some variable,30 ms
17: Synchronized beats for well A1:
  1. 行号已删除,行首 "Synchronized beats for well 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
    

这是 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 实用程序,看起来这一行的开头有一个换行符。但是,它仍然可以识别之后的 "Synchronized" 单词。

    [fl,p]=grep('-e','Synchronized','C:\Users\Traveler\Documents160825\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
    

顺便说一句,这也意味着当我要检测后面的数据时,行号偏移了很多,因为这种问题发生在多行上。

所以我的问题是:为什么会发生这种情况,在 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

Line ending conventions 是讨厌的东西。它们是回车 return(CR、\r、ASCII 13)和换行符(LF、\n、ASCII 10)的某种组合。 Windows 惯例是 CR/LF。 Mac OSX 是 LF。您的乐器可能两者都不是。在我看来,至少您的某些行以空车架 return 结尾,是用 MATLAB(和许多其他语言)生成的 \r。如果在 UNIX-ish OS 上输出一行文本后仅跟有 CR,您将得到没有 LF 的 CR,这意味着下一行文本将覆盖屏幕上的前一行 .

通过查看裸 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或类似的方法来挑选你需要的行并直接处理它们。