在 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,:});