这个函数将单元格数组写入csv文件。
它可以处理空单元格、数字单元格、字符单元格、字符串单元格和逻辑单元格。一个数组可以包含所有这些值,但每个单元格只能包含一个值。
csv文件可以通过Excel读取,所以不需要DDE或ActiveX。
Sylvain Fiedler(2021)。单元格数组到CSV文件[Cell2CSv.m](//www.tatmou.com/matlabcentral/fileexchange/4400-cell-array-to-csv-file-cell2csv-m), MATLAB中央文件交换。检索.
我定期使用这个函数,它总是很棒。但是现在我遇到了一些问题。我想将不同类型的单元格保存到TXT文件中,当我在MATLAB中打开生成的文本文件时运行良好。但是,如果我打开matlab外部的文件(例如,用记事本),小区的行不作为TXT文件中的单个行分隔。
一个例子:
我想要这样的:
Header1, Header 2, Header 3
Data1、999999、888888
Data2 77777, 66666
但是生成的文本文件是这样的
标题1,标题2,标题3,Data1,999999,888888,Data2,7777,66666
有任何想法吗?非常感谢
此功能不适用于逗号的单元格。例如,如果我运行
out = {'ReadMe, Inc.', 'ReadMe2, LLC'};
cell2csv(“\ test.csv”);
由此产生的CSV Fille具有四个单元格,而不是两个。有谁知道如何解决这个问题吗?
如此有效!
非常感谢!
好简单,但有点慢。
省了我复制代码的麻烦。
可以通过使用'w'而不是在fopen中增强它,而且更快!autoflush非常慢!
看看这个链接:http://blogs.mathworks.com/loren/2006/04/19/high-performance-file-io/
这对我不适用于不同专栏尺寸的2D细胞阵列。要解决此问题,我将fprintf更改为以下内容:
尝试
流(datei ' % s ', var {1,});
抓住
结束
例如3d单元阵列
仅供参考:
当我的单元格数组有一个带字符串的行时,我遇到了问题:所有值都被写为“na”,所谓的,因为它们没有验证stringx(x)的所有elsefif的条件。
如果我删除了最后一个else,它会给我一个错误:“错误使用sprintf
功能未为“Cell”输入定义。“
所以我把最后一个else改成
其他的
x ='na';
:
其他的
x = char (x);
它工作。没有更多的“NA”。
谢谢你的脚本。良好的工作;)
我根据Justin和Jan的建议进行了修改也增加了对行向量的支持。金宝app现在快多了。查看更新的文件在//www.tatmou.com/matlabcentral/fileexchange/47055-cell2csv-m
学分归西尔万。
一个非常方便的代码。但是,对于保存大型表来说,它有点慢。
Jan Simon的建议很有帮助。进一步提高其速度的另一种方法是将输出尽可能捆绑到fprintf()。例如,在一次调用中编写整行代码,而不是为每个单元格调用fprintf()。
这两种调整可以将味道时间降低> 60%。
该功能具有很大的改进潜力:
"var = eval(['cellArray{z,s}']);"可以被更快更好的"v = cellArray{z,s};"替换。
“如果尺寸(var,1)== 0”不会捕获[1x0]阵列,而“isempty(v)”则会捕获。
检查Fopen的成功强烈建议避免奇怪的行为。
文档是足够的,函数工作如广告。
很好的函数,但是从fopen()中检查适当的结果可能更好(只是为了让用户得到更好的错误消息)。
是否有像Manish Mittal在2005年9月15日所写的带有“追加”的版本?
找不到它!
但是会很棒的!我需要精确的这个…只有一个"追加"选项
CSV2Cell可以通过使用UigetFile和TextScan的组合来完成。
很好的m脚本。这里是CellStr内容和空单元格的差异:
< fprintf(datei, '%s', var{1});
diff cell2csv.m cell2csv_orig.m
70,73C70,72.
<如果isempty (var)
<继续
<结束
<
---
> %输出值
> fprintf(datei,'%s',var);
>
75C74.
<如果s〜= 1%尺寸(Cellarray,2)
---
> if s ~= size(cellArray, 2)
78,86d76.
<
< %输出值
<如果ischar (var)
< fprintf(datei, '%s', var);
<结束
<
<
谢谢,只是使用它转换一个1048576x10单元阵列到csv,花了大约5个小时,但没有崩溃。
谢谢你的伟大脚本,只是一个备注,我修改了第56行,以便根据某些窗口和Visual Basic程序的要求使用CR / LF终止输出。
流(datei ' \ r \ n ');
它可能值得添加为选项。
到目前为止,它工作得很好:)顺便说一下,你可以使用textscan函数在matlab 7转换CSV到单元阵列
这显然是mathworks.com上另一个cell2cvs的旧版本,应该删除
越野车。在某些情况下打破fprintf
我在我的所有Matlab代码中使用了这一点--thanx!但我无法帮助想知道是否有人制作了CSV2Cell?
很有帮助,谢谢分享!
有没有代码的代码是它的 - CSv2Cell?我见过C版本,但不是Matlab的版本 - 自己有点麻烦写一个。
谢谢 - 凯文
这是一个很大的帮助。我很难在细胞阵列周围缠绕我的思想,这是完美的。非常灵活,简单,用户友好。谢谢!
根据上面的评论,这是非常棒的。我只是用它来生成文本文件输出,非常完美。
这里是另一个版本的相同文件与追加,覆盖等选项。此外,delimeter的问题是固定的
函数cell2csv(文件名,cellarray,delimiter,模式)
%将单元格数组内容写入*.csv文件。
%
% CELL2CSV(文件名、cellArray分隔符)
%
% filename =要保存的文件名。(即。' text.csv ']
% cellarray =数据所在的单元格数组的名称
% delimiter =分隔符,通常为:','(默认)
% mode =指定打开文件的模式。有关详细信息,请参阅fopen()
% list(默认是覆盖,即。' w ')
%
%由Sylvain Fiedler,Ka,2004年
由Rob Kohr,Rutgers,2005修改% - 改为英语和固定分隔符
如果输入参数个数< 3
分隔符= " ";
结束
如果输入参数个数< 4
模式= ' w ';
结束
datei = fopen(文件名,模式);
对z = 1:尺寸(cellArray, 1)
s = 1:尺寸(cellArray, 2)
var = eval(['cellarray {z,s}'));
If size(var,1) == 0
var ='';
结束
If isnumeric(var) == 1
var = num2str(var);
结束
流(datei var);
如果s〜= size(cellarray,2)
流(datei,分隔符);
结束
结束
流(datei ' \ n ');
结束
文件关闭(datei);
除了R k的注释外,将第32-34行更改为:
如果s〜= size(cellarray,2)
fprintf(Datei,Trennzeichen);
结束
因为它是一个CSV,所以应该用逗号作为分隔符。
if nargin<3,trennZeichen = ','
太好了,这正是我需要的。
伟大的。还需要接受一个不同的分隔符,所以除了第32行,它需要改变第12行
if nargin<3,trennZeichen = ';'
它很简单,它是有效的,不仅可以编写CSV,它可以读取由用户更改“分隔符”创建的格式。第32行的需求和调整:
流(datei trennZeichen);
简单有效。