从文本文件中读取字段并将其存储在结构中

时间:2013-07-23 18:32:55

标签: 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 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 

现在我很难过。

假设我在信息所在的行,我如何用regexp存储信息?运行代码后,我为data得到了一个空数组...

提前致谢。

1 个答案:

答案 0 :(得分:4)

我发现最容易使用textscan将行读入单元格数组:

%// Read lines as strings
fid = fopen('input.txt', 'r');
C = textscan(fid, '%s', 'Delimiter', '\n');
fclose(fid);

然后对其应用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及其相应的(字符串)值,你所要做的就是用正确的语法将它插入struct(使用{{3 }} 在这种情况下)。请注意,字段名称中包含空格,因此在使用它们之前需要注意(例如用下划线替换它们):

C(1, :) = strrep(C(1, :), ' ', '_'); %// Replace spaces with underscores
data = struct(C{:});

以下是我输入文件的内容:

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'

当然,通过将所有相关数字转换为数值,将“通道”字段组合在一起等等,可以更美化它,但我会留给您。祝你好运!