【问题标题】:How to avoid the repeated paragraghs of long txt files being ignored for importdata in matlab如何避免在matlab中导入数据时忽略长文本文件的重复段落
【发布时间】:2023-03-10 02:51:01
【问题描述】:

我正在尝试从具有这种形式的 txt 文件中导入所有双精度

#25x1 字符串 #9999x2 双 . . . #(重复十次)

但是,当我尝试使用导入向导时,只有第一个

25x1 字符串 9999x2 双倍。

已成功加载,其他 9 个被忽略

如何导入所有数据? (importdata 是否有最大长度?) 谢谢

【问题讨论】:

    标签: matlab


    【解决方案1】:

    这与最大长度无关,importdata 只是没有为您描述的那种数据文件设置。从帮助文件中:

    对于 ASCII 文件和电子表格,importdata 需要 以矩形形式(即,像矩阵)查找数值数据。 文本标题可以出现在数字数据的上方或左侧, 如下:

    文件顶部的列标题或文件描述文本,上面 数值数据。数值数据左侧的行标题。

    所以发生的情况是,文件的第一部分与importdata 期望的格式匹配,正在被读取,其余部分被忽略。你需要使用textscan,而不是importdata,尤其是这种风格:

    C = textscan(fileID,formatSpec,N)
    

    fileIDfopen 返回。 formatspec 告诉 textscan 会发生什么,以及 N 重复它多少次。只要fileID 保持打开状态,对textscan 的重复调用就会继续从上次读取操作停止的地方读取文件——而不是回到文件的开头。所以我们可以这样做:

    fileID = fopen('myfile.txt');
    repeats = 10;
    
    for n = 1:repeats
    
        % read one string, 25 times
        C{n,1} = textscan(fileID,'%s',25); 
        % read two floats, 9999 times
        C{n,2} = textscan(fileID,'%f %f',9999);
    
    end
    

    然后您可以从元胞数组中提取您的数值数据(如果您需要它在一个块中,您可能想尝试使用'CollectOutput',1 作为选项)。

    【讨论】:

    • 导入向导建议 25x1(每行视为 1),但是,当我使用 textscan 时,它会逐字而不是逐行获取。所以不要阅读前 25 行。它获取了前 25 个单词并停下来阅读双精度词。我怎么能告诉matlab不要那样做?谢谢
    • 我把它改成了 % read one string, 25 times C{n,1} = textscan(fileID,'%s',25,'Delimiter','\r');及其现在的工作。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2018-11-30
    • 2013-04-19
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多