我是Mac用户(10.6.8),使用MATLAB处理计算结果。我输出大型数字表到.csv文件。然后我在EXCEL中使用.csv文件。一切正常。
问题是每列数字都需要一个标签(一个字符串标题)。我无法弄清楚如何将标签连接到数字表。我非常感谢任何建议。以下是一些可能有用的进一步信息:
我的标签包含在单元格数组中:
columnsHeader = cell(1,15)
我填写计算结果;例如:
columnsHeader{1} = propertyStringOne (where propertyStringOne = 'Liq')
每个计算的标签序列都不同。我的第一次尝试是尝试直接连接标签:
labelledNumbersTable=cat(1,columnsHeader,numbersTable)
我收到的错误是连接类型必须相同。所以我尝试使用cell2mat转换标签/字符串:
columnsHeader = cell2mat(columnsHeader);
labelledNumbersTable = cat(1,columnsHeader,numbersTable)
但这需要所有单独的标签并将它们组成一个长字......这导致:
???使用==>时出错猫
CAT参数维度不一致。
有没有人知道可以让我保留原始单元格标签的替代方法?
答案 0 :(得分:6)
您必须以两种不同的方式处理将列标题和数字数据写入文件。输出字符串的单元格数组必须使用FPRINTF函数完成,如this documentation for exporting cell arrays to text files中所述。然后,您可以使用函数DLMWRITE将数字数据附加到文件(已包含列标题),从而输出数字数据。这是一个例子:
fid = fopen('myfile.csv','w'); %# Open the file
fprintf(fid,'%s,',columnsHeader{1:end-1}); %# Write all but the last label
fprintf(fid,'%s\n',columnsHeader{end}); %# Write the last label and a newline
fclose(fid); %# Close the file
dlmwrite('myfile.csv',numbersTable,'-append'); %# Append your numeric data
答案 1 :(得分:6)
其他人已经表明了问题的解决方案。我正在分享一个稍微不同的解决方案,可以提高性能,尤其是在尝试将大型数据集导出为CSV文件时。
不是使用DLMWRITE来编写数值数据(内部在矩阵的每一行上使用for循环),而是可以直接调用FPRINTF来一次写入整个事物。如果数据有很多行,您可以看到显着的改进。
说明差异的例子:
%# some random data with column headers
M = rand(100000,5); %# 100K rows, 5 cols
H = strtrim(cellstr( num2str((1:size(M,2))','Col%d') )); %'# headers
%# FPRINTF
tic
fid = fopen('a.csv','w');
fprintf(fid,'%s,',H{1:end-1});
fprintf(fid,'%s\n',H{end});
fprintf(fid, [repmat('%.5g,',1,size(M,2)-1) '%.5g\n'], M'); %'# default prec=5
fclose(fid);
toc
%# DLMWRITE
tic
fid = fopen('b.csv','w');
fprintf(fid,'%s,',H{1:end-1});
fprintf(fid,'%s\n',H{end});
fclose(fid);
dlmwrite('b.csv', M, '-append');
toc
我的机器上的时间如下:
Elapsed time is 0.786070 seconds. %# FPRINTF
Elapsed time is 6.285136 seconds. %# DLMWRITE