【问题标题】:Matlab output array to excel or other file format with specific nameMatlab 输出数组到 excel 或具有特定名称的其他文件格式
【发布时间】:2014-06-20 23:47:19
【问题描述】:

我有一个 excel 文件目录,我需要将其作为数组读入 Matlab,转置数组,然后导出回 excel 文件。 excel文件数组是32626 x 153,所以我认为我不能先输出到excel文件。我正在考虑输出到 *.txt*.csv 文件,然后在 excel 中打开它。我写的当前代码正在尝试写入*.csv 文件

我需要输出文件的名称来包含输入文件名称的一部分。比如输入文件名是data.xlsx,我需要输出文件名是data_transposed.csv

以下是我已经编写的代码,用于读取目录中的*.xlsx文件并将数据保存到数组中,然后转置数组,然后将转置后的数组写入*.csv文件。

files = dir('*.xlsx');
for i = 1:length(files)
    filename = files(i).name;
    [path, name, extention] = fileparts(filename);
    array = xlsread(filename);
    transposearray = transpose(array);
    csvwrite('outputfile.csv' , transposearray)
end

这段代码有几个问题:

  1. 输出文件名是'outputfile',而不是我需要的'inputfilename_transpose' 的一部分。 (见上面的解释)
  2. 输出文件名是'outputfile',而不是我需要的'inputfilename_transpose' 的一部分。 (见上面的解释) 此代码仅将目录中的第一个*.xlsx 文件写入输出文件。我知道循环正在遍历目录中的所有 *.xlsx 文件,因为当我从所有其他行中删除分号并注释掉 csvwrite 行时,Matlab 正在获取正确的信息。

编辑: 下面的代码可以为每个输入文件输出一个文件,并在输出文件名中包含输入文件名

files = dir('*.xlsx');
for i = 1:length(files)
    filename = files(i).name;
    [path, name, extention] = fileparts(filename);
    array = xlsread(filename);
    transposearray = transpose(array);
    csvwrite(['outputfile',name,'.csv'] , transposearray)
end

Excel 仍然不会读取输出文件,因为它的列数是 Excel 可以打开的两倍。如何将转置列的前半部分解析为工作表 1,将转置列的后半部分解析为同一个 Excel 工作簿的工作表 2?我认为这意味着我现在必须使用xlswrite() 而不是csvwrite()

编辑:excel 的列太多,无法读取文件。因此,我必须将数据解析为一张工作表中的两张单独的表格。 第一个 xlswrite 需要获取前 16,384 列(所有 153 行)并将值放在从 A1 开始的 Excel 工作表 1 中。 第二个 xlswrite 需要将列号 16,385 带到最后一列(所有 153 行),并将值从 A1 开始放在 Excel 工作表 2 中。 我该怎么做?

【问题讨论】:

  • 关于您的编辑:您需要分解要导出的数组。将整个数组导出到两个单独的工作表不会比一张工作表上的完整数组更好。您不必在 excel 中指定要导出到的单元格范围,指定您的数据范围和工作表。如果不指定范围,则默认从 A1 开始。阅读the documentation

标签: arrays excel matlab csv


【解决方案1】:

代码写入目录中的所有文件,然后所有文件都具有相同的名称,它们将被覆盖。试试这个

files = dir('*.xlsx');
for i = 1:length(files)
    filename = files(i).name;
    [path, name, extention] = fileparts(filename);
    array = xlsread(filename);
    transposearray = transpose(array);
    csvwrite([path,'\',name,'_transpose','.csv'] , transposearray)
end

请注意dir 按操作系统指定的顺序读取文件,可能并不总是按名称排序,即使您在文件夹中查看文件时按名称对文件进行了排序

对于编辑部分

files = dir('*.xlsx');
for i = 1:length(files)
    filename = files(i).name;
    [path, name, extention] = fileparts(filename);
    array = xlsread(filename);
    transposearray = transpose(array);
    n  = ceil(size(transposearray,2)/2);
    transportarray_part1 = transposearray(:,1:n);
    transposearray _part2 = transposearray(:,n+1:end);
    xlswrite([path,'\',name,'_transpose','.csv'], transposearray_part1,1);
    xlswrite([path,'\',name,'_transpose','.csv'], transposearray_part2,2);
end

【讨论】:

  • 最好使用fullfile(或至少filesep)而不是手动指定文件分隔符以避免操作系统兼容性问题。
  • 太棒了!现在唯一的问题是,列数超出了 excel 所能支持的范围——实际上列数增加了一倍。无论如何将转置列的一半输出到一张excel表,另一半输出到第二张excel表?我认为这意味着我必须改用 xslxwrite()。
  • @user3736288 是的,通过使用xlswrite,您可以根据需要拆分数据并指定要写入每个块的工作表。有关语法,请参阅文档中的示例。
  • 看来xlswrite的range部分是指定excel中的具体单元格,而不是具体要写入excel的数据
  • 是的,我已经链接的the documentation 会告诉您这一点并为您提供要使用的语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
相关资源
最近更新 更多