Ant*_*Ant 5 csv file-io matlab concatenation
我是Mac用户(10.6.8),使用MATLAB处理计算结果.我输出大型数字表到.csv文件.然后我在EXCEL中使用.csv文件.一切正常.
问题是每列数字都需要一个标签(一个字符串标题).我无法弄清楚如何将标签连接到数字表.我非常感谢任何建议.以下是一些可能有用的进一步信息:
我的标签包含在一个单元格数组中:
columnsHeader = cell(1,15)
Run Code Online (Sandbox Code Playgroud)
我用计算结果填写; 例如:
columnsHeader{1} = propertyStringOne (where propertyStringOne = 'Liq')
Run Code Online (Sandbox Code Playgroud)
每个计算的标签序列都不同.我的第一次尝试是尝试直接连接标签:
labelledNumbersTable=cat(1,columnsHeader,numbersTable)
Run Code Online (Sandbox Code Playgroud)
我收到一个错误,连接类型需要相同.所以我尝试使用cell2mat转换标签/字符串:
columnsHeader = cell2mat(columnsHeader);
labelledNumbersTable = cat(1,columnsHeader,numbersTable)
Run Code Online (Sandbox Code Playgroud)
但这需要所有单独的标签,并使它们成为一个长字...这导致:
??? 使用==> cat时出错
CAT参数维度不一致.
有没有人知道一种替代方法,可以让我保留我的原始单元格标签?
您必须以两种不同的方式处理将列标题和数字数据写入文件.输出字符串的单元格数组必须使用FPRINTF函数完成,如本文档中所述,用于将单元格数组导出到文本文件.然后,您可以使用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
Run Code Online (Sandbox Code Playgroud)
其他人已经表明了解决问题的方法.我正在共享一个稍微不同的解决方案,可以提高性能,尤其是在尝试将大型数据集导出为CSV文件时.
您可以直接调用FPRINTF来写入整个事物,而不是使用DLMWRITE来编写数值数据(内部在矩阵的每一行上使用for循环).如果数据有很多行,您可以看到显着的改进.
举例来说明差异:
%# 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
Run Code Online (Sandbox Code Playgroud)
我的机器上的时间如下:
Elapsed time is 0.786070 seconds. %# FPRINTF
Elapsed time is 6.285136 seconds. %# DLMWRITE
Run Code Online (Sandbox Code Playgroud)