Regex 从文本文件中读取字段并将其存储在结构中
我正在尝试读取一个如下所示的文件:Regex 从文本文件中读取字段并将其存储在结构中,regex,matlab,text-parsing,Regex,Matlab,Text Parsing,我正在尝试读取一个如下所示的文件: Data Sampling Rate: 256 Hz ************************* Channels in EDF Files: ********************** Channel 1: FP1-F7 Channel 2: F7-T7 Channel 3: T7-P7 Channel 4: P7-O1 File Name: chb01_02.edf File Start Time: 12:42:57 File End T
Data Sampling Rate: 256 Hz
*************************
Channels in EDF Files:
**********************
Channel 1: FP1-F7
Channel 2: F7-T7
Channel 3: T7-P7
Channel 4: P7-O1
File Name: chb01_02.edf
File Start Time: 12:42:57
File End Time: 13:42:57
Number of Seizures in File: 0
File Name: chb01_03.edf
File Start Time: 13:43:04
File End Time: 14:43:04
Number of Seizures in File: 1
Seizure Start Time: 2996 seconds
Seizure End Time: 3036 seconds
到目前为止,我有以下代码:
fid1= fopen('chb01-summary.txt')
data=struct('id',{},'stime',{},'etime',{},'seizenum',{},'sseize',{},'eseize',{});
if fid1 ==-1
error('File cannot be opened ')
end
tline= fgetl(fid1);
while ischar(tline)
i=1;
disp(tline);
end
我想使用regexp
查找表达式,因此:
line1 = '(.*\d{2} (\.edf)'
data{1} = regexp(tline, line1);
tline=fgetl(fid1);
time = '^Time: .*\d{2]}: \d{2} :\d{2}' ;
data{2}= regexp(tline,time);
tline=getl(fid1);
seizure = '^File: .*\d';
data{4}= regexp(tline,seizure);
if data{4}>0
stime = '^Time: .*\d{5}';
tline=getl(fid1);
data{5}= regexp(tline,seizure);
tline= getl(fid1);
data{6}= regexp(tline,seizure);
end
我尝试使用循环查找文件名以以下开头的行:
for (firstline<1) || (firstline>1 )
firstline= strfind(tline, 'File Name')
tline=fgetl(fid1);
end
for(firstline1)
firstline=strfind(t行“文件名”)
tline=fgetl(fid1);
结束
现在我被难倒了
假设我在信息所在的行上,如何使用regexp
存储信息?在运行了一次代码之后,我得到了一个用于数据的空数组
提前感谢。我发现首先使用以下方法将行读入单元阵列最简单:
然后应用它来完成其余的操作:
%// Parse field names and values
C = regexp(C{:}, '^\s*([^:]+)\s*:\s*(.+)\s*', 'tokens');
C = [C{:}]; %// Flatten the cell array
C = reshape([C{:}], 2, []); %// Reshape into name-value pairs
现在您有了一个包含字段名及其对应(字符串)值的单元格数组C
,您所要做的就是将其插入到正确的语法中(在本例中使用a)。请注意,字段名中有空格,因此在使用它们之前需要注意这一点(例如,用下划线替换):
以下是我从您的输入文件中获得的信息:
data =
Data_Sampling_Rate: '256 Hz'
Channel_1: 'FP1-F7'
Channel_2: 'F7-T7'
Channel_3: 'T7-P7'
Channel_4: 'P7-O1'
File_Name: 'chb01_03.edf'
File_Start_Time: '13:43:04'
File_End_Time: '14:43:04'
Number_of_Seizures_in_File: '1'
Seizure_Start_Time: '2996 seconds'
Seizure_End_Time: '3036 seconds'
当然,可以通过将所有相关数字转换为数值、将“通道”字段组合在一起等等来美化它,但我将把这个留给您。祝你好运 我发现首先使用以下方法将行读入单元格数组最简单:
然后应用它来完成其余的操作:
%// Parse field names and values
C = regexp(C{:}, '^\s*([^:]+)\s*:\s*(.+)\s*', 'tokens');
C = [C{:}]; %// Flatten the cell array
C = reshape([C{:}], 2, []); %// Reshape into name-value pairs
现在您有了一个包含字段名及其对应(字符串)值的单元格数组C
,您所要做的就是将其插入到正确的语法中(在本例中使用a)。请注意,字段名中有空格,因此在使用它们之前需要注意这一点(例如,用下划线替换):
以下是我从您的输入文件中获得的信息:
data =
Data_Sampling_Rate: '256 Hz'
Channel_1: 'FP1-F7'
Channel_2: 'F7-T7'
Channel_3: 'T7-P7'
Channel_4: 'P7-O1'
File_Name: 'chb01_03.edf'
File_Start_Time: '13:43:04'
File_End_Time: '14:43:04'
Number_of_Seizures_in_File: '1'
Seizure_Start_Time: '2996 seconds'
Seizure_End_Time: '3036 seconds'
当然,可以通过将所有相关数字转换为数值、将“通道”字段组合在一起等等来美化它,但我将把这个留给您。祝你好运