将数据从.cnv文件导入matlab

将数据从.cnv文件导入matlab,matlab,import,Matlab,Import,我正试图从.cnv文件中读取一些数据。我可以通过以下方式打开文件: TopFolder = 'Name_of_my_file'; SubFolder = dir(fullfile(TopFolder,'*.cnv')); fid = fopen(fullfile(TopFolder,SubFolder{i})); 所有数据都位于字符串结尾之后,该字符串结尾位于其他标题的单独一行上。我想导入存储在该字符串后面的行中的数据。如何做到这一点 例如,.cnv文件的a部分如下所示: # datcnv_i

我正试图从.cnv文件中读取一些数据。我可以通过以下方式打开文件:

TopFolder = 'Name_of_my_file';
SubFolder = dir(fullfile(TopFolder,'*.cnv'));
fid = fopen(fullfile(TopFolder,SubFolder{i}));
所有数据都位于字符串结尾之后,该字符串结尾位于其他标题的单独一行上。我想导入存储在该字符串后面的行中的数据。如何做到这一点

例如,.cnv文件的a部分如下所示:

# datcnv_in = D:\data\110606_000.hex D:\instrument software\Seabird 2010-07\Seabird Con Files\SBE19_2108_ScufaTOBS.con
# datcnv_skipover = 0
# file_type = ascii
*END*
     -0.051     0.0312    15.4328   138.1551     0.0000     0.0000     0.0000     0.0000  0.000e+00
     -0.033     0.0305    15.4277   138.1551     0.0000     0.0000     0.0000     0.0000  0.000e+00
所以,我想在结束之前避免这些台词


也许第一步是找到END的行号?如何执行此操作?

在matlab中使用导入向导时,可以指定标题行数。 如果将其设置为4,则在本例中应该可以使用

使用导入向导后,如果您希望将来自动执行该过程,可以让它生成代码。

尝试以下操作:

L = '';
while isempty(findstr(L,'*END*'))  % if the line doesn't contain *END* => read a new line
    L = fgetl(fid);                % read next line of file
end
a = fscanf(fid,'%g %g %g %g');     % add as many %g as columns in your data
fclose(fid);
我已经添加了一些关于如何工作的评论。基本上,它逐行读取打开的文件,直到找到一行包含
*END*


如果有多行可能包含相同的字符,则可以使用strcmp(L,“*END*”)


警告:此代码假定您正在读取的文件至少包含一行具有
*END*
字符,如果不包含,则在尝试读取超出EOF的内容时将出错


希望这能有所帮助。

首先打开文件,搜索所有行,直到找到“结束”

接下来将数据逐行读取到矩阵中(
data
):


如果能够做到这一点,而不必指定标题行的数量,也就是说,可以通过指定数据从字符串结尾后的行开始来实现这一点。我想有一种更精确的方法,但解决方案可能是:将整个文件作为文本导入,找到结尾,从顶部剪切,请你解释一下脚本的第一部分是如何工作的。虽然这样做很好,但我不明白怎么做!如果Linechk初始等于0,那么在while循环之后它怎么可能等于1?另外,“Linechk”有什么用途?代码的其余部分不使用该变量?Linechk变量不一定是必需的。我认为这会使遵循代码变得更容易。如果找到“END”序列,则它本质上是一个==1的标志。我已经更新了答案以删除变量。
fid = fopen('yourfile.cnv')     % open file to read
fseek(fid,0,-1);                % set read position to beginning of file
while strcmp(fgetl(fid),'*END*') == 0 end        % go through lines until '*END*'
n=1;                            
while 1
    tline = fgetl(fid)                 % read in line
    if ~ischar(tline), break, end       % if eof, break and finish
    data(:,n) = sscanf(tline,'%f')     % put numbers in a matrix (in columns)
    n=n+1
end

fclose(fid)    % close file