【问题标题】:Matlab: output format with fprintfMatlab:使用 fprintf 输出格式
【发布时间】:2014-12-01 00:34:15
【问题描述】:

我想在一个文本文件中有一个数据列表,为此我使用:

fprintf(fid, '%d %s %d\n',ii, names{ii},vals(ii));

我的数据中的问题,有些名字比其他名字长。所以我得到这种形式的结果:

1 XXY 5
2 NHDMUCY 44
3 LL 96
...

我如何更改 fprintf 代码行以生成这种形式的结果:

1 XXY        5
2 NHDMUCY   44
3 LL        96
...

【问题讨论】:

    标签: matlab


    【解决方案1】:

    在循环开始之前是这样的 -

    %// extents of each vals string and the corresponding whitespace padding
    lens0 = cellfun('length',cellfun(@(x) num2str(x),num2cell(1:numel(names)),'Uni',0))
    pad_ws_col1 = max(lens0) - lens0 
    
    %// extents of each names string and the corresponding whitespace padding
    lens1 = cellfun('length',names)
    pad_ws_col2 = max(lens1) - lens1
    

    然后,在循环内部 -

    fprintf(fid, '%d %s %s %s %d\n',col1(ii), repmat(' ',1,pad_ws_col1(ii)), ...
        names{ii},repmat(' ',1,pad_ws_col2(ii)),vals(ii));
    

    输出将是 -

    1 XXY      5
    2 NHDMUCY  44
    3 LL       96
    

    对于99 - 101 的范围,它将是 -

    99   XXY      5
    100  NHDMUCY  44
    100  LL       96
    

    请注意,第三列数字 start 在固定距离处,而不是 end 在距每行开头固定距离处,如问题中所述。但是,假设问题的整个想法是以更易读的方式呈现数据,这可能对您有用。

    【讨论】:

    • 非常感谢 Divakar :)。当第一列的值从 9 变为 10 或从 99 变为 100 时,存在一个小问题。
    • 非常好的 Divakar ... +1
    【解决方案2】:

    您可以使用函数char 将字符串元胞数组转换为字符数组,其中所有行将被填充为最长行的长度。

    所以对你来说:

    charNames = char( names ) ;
    

    那么你可以使用fprintf

    fprintf(fid, '%d %s %d\n',ii, charNames(ii,:) , vals(ii)) ;
    

    只需确保您的元胞数组是一个列,然后再将其转换为 char。

    【讨论】:

    • 非常好!对于从 99 变为 100 的第一列,可以使用此 char 数组技巧与 - charIDs = char(strtrim(cellstr(num2str([1:numel(names)].')))),然后使用 charIDs 而不是 ii
    猜你喜欢
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多