Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 从文本文件中读取字段并将其存储在结构中_Regex_Matlab_Text Parsing - Fatal编程技术网

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'
当然,可以通过将所有相关数字转换为数值、将“通道”字段组合在一起等等来美化它,但我将把这个留给您。祝你好运