我有一个由约100万行的乐器创建的csv数据文件。我正在Windows机器上的Matlab中创建一个GUI程序来分析这些数据。我需要检测数据的开始位置,因为文件以很多不同的实验数据开头。但是,在Matlab中使用文件交换中的grep实用程序返回错误的行号。所以我将文件复制到我的Mac上,发现内置的Unix实用程序有这种奇怪的行为。
不仅没有返回搜索词存在的整行;它还删除正则表达式或脚本应返回的行号!
我已将文件缩小为下面的一个小例子。这是奇怪的行为:
期望的结果:
11: Synchronized blah blah some variable,30 ms
17: Synchronized beats for well A1:
删除行号,并删除行“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实用程序,看起来此行的开头有一个换行符。但是,它仍然可以识别出“同步”字样。
[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
顺便说一下,这也意味着当我想要检测以后的数据时,行号会相当多,因为这种类型的问题发生在多行上。
所以我的问题:为什么会发生这种情况,我可以在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
答案 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
或类似内容选择所需的行并直接处理。