在 Matlab 中写入 csv 之前如何将单元格识别为字符串或数字或两者
How to identify a cell as a string or number or both before writing out to csv in Matlab
我想在一个循环中将多个元胞数组写入 Matlab 中的 csvs。
元胞数组包含字符串和数字。
我的问题是其中一些有时同时包含字符串和数字:
例如:海拔可以记录为“200”或“200 米”……这意味着我不能指定 %f 或 %s,因为在某些情况下,它会出错并写错。
这是我正在使用的:
fid = fopen('test.csv', 'w') ;
fprintf(fid, '%s,\t', csvdata{1,1:end}) ;
fprintf(fid,'\n,%f, %f, %f,%f, %f, %s,%s, %f, %f,%s, %f, %s,%s, %f, %s,%s, %s, %s,%s, %s,%s,%s,%s',csvdata{2,:});
fclose all
有没有既能识别字符串又能识别数字的字符?或者是否有另一种方法可以使代码更灵活,以便在数据不是预期的数字时识别?
您可以通过检查数据类型来制作格式字符串。在下面的示例中,我获取输出的第一行并检查每个元素是否为字符 (ischar
)。这对非字符产生 0
,对字符产生 1
。然后我将 1
添加到非字符变为 1
并且字符变为 2
。然后我用它来索引包含格式说明符的元胞数组。最后,我使用 strjoin
.
将格式字符串与逗号连接在一起
% Get a 1 for numeric data and 2 for character data
inds = cellfun(@ischar, csvdata(2,:)) + 1;
% Create an array of format specifiers to index into
formats = {'%f', '"%s"'};
% Index into this array of format specifiers (also append a newline like you've shown)
formatparts = {'\n', formats{inds}};
% Join everything together with commas
formatstr = strjoin(formatparts, ',');
% Go ahead and write out the data
fprintf(fid, formatstr, csvdata{2,:});
我想在一个循环中将多个元胞数组写入 Matlab 中的 csvs。 元胞数组包含字符串和数字。 我的问题是其中一些有时同时包含字符串和数字: 例如:海拔可以记录为“200”或“200 米”……这意味着我不能指定 %f 或 %s,因为在某些情况下,它会出错并写错。 这是我正在使用的:
fid = fopen('test.csv', 'w') ;
fprintf(fid, '%s,\t', csvdata{1,1:end}) ;
fprintf(fid,'\n,%f, %f, %f,%f, %f, %s,%s, %f, %f,%s, %f, %s,%s, %f, %s,%s, %s, %s,%s, %s,%s,%s,%s',csvdata{2,:});
fclose all
有没有既能识别字符串又能识别数字的字符?或者是否有另一种方法可以使代码更灵活,以便在数据不是预期的数字时识别?
您可以通过检查数据类型来制作格式字符串。在下面的示例中,我获取输出的第一行并检查每个元素是否为字符 (ischar
)。这对非字符产生 0
,对字符产生 1
。然后我将 1
添加到非字符变为 1
并且字符变为 2
。然后我用它来索引包含格式说明符的元胞数组。最后,我使用 strjoin
.
% Get a 1 for numeric data and 2 for character data
inds = cellfun(@ischar, csvdata(2,:)) + 1;
% Create an array of format specifiers to index into
formats = {'%f', '"%s"'};
% Index into this array of format specifiers (also append a newline like you've shown)
formatparts = {'\n', formats{inds}};
% Join everything together with commas
formatstr = strjoin(formatparts, ',');
% Go ahead and write out the data
fprintf(fid, formatstr, csvdata{2,:});