奇怪的正则表达式行为,可能带有换行符
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:
行号已删除,行首 "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
我写了一个 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
使用 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
或类似的方法来挑选你需要的行并直接处理它们。
我有一个由仪器创建的 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:
行号已删除,行首 "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
我写了一个 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
使用 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
或类似的方法来挑选你需要的行并直接处理它们。