将字符串数组保存为 CSV

Saving a string array to CSV

我有一个 25194081x2 的字符串矩阵,称为 s1。下面是数据的外观。

我正在尝试将此矩阵保存到 csv。我尝试了下面的代码,但出于某种原因,它保存了向量的第一列两次(并排)而不是两列。

我做错了什么?

fileID= fopen('data.csv', 'w') ;
 fprintf(fileID, '%s,%s\n', [s1(:,1) s1(:,2)]);
 fclose(fileID)

不要像现在这样将列合并到字符串数组中,而是将它们作为单独的参数提供,并遍历 s1:

的行
fileID= fopen('data.csv', 'w') ;
for k = 1:size(s1,1)
    fprintf(fileID, '%s,%s\n', s1(k,1), s1(k,2));
end
fclose(fileID)

或者,如果您使用的是 >R2019a,则可以使用 writematrix:

writematrix(s1, 'data.csv');

我的 MATLAB (R2016a) 版本还没有可用的 string 类型,但你的问题是我经常遇到的字符向量元胞数组问题。我用来避免对 fprintf 使用循环的技巧应该适用于你。

让我们从最接近您的示例数据开始:

s1 = {'2F5E8693E','al1 1aj_25';
      '3F5E8693E','al1 1aj_50';
      '3F5E8693E','al1 1aj_50';}

然后这段代码对我来说通常比​​在矩阵上循环写入文件要快得多:

% step 1: transpose, to get the matrix in the MATLAB default column major order
s  = s1.' ;

% step 2 : Write all in a long character array
so = sprintf('%s, %s\n', s{:} ) ;

% step 3 : write to file in one go (no need loop)
fid = fopen('data.csv', 'w') ;
fprintf(fid,'%c',so) ;
fclose(fid) ;

唯一与您略有不同的步骤可能是第 2 步。我不知道此语法是否适用于 string 的矩阵,是否适用于字符元胞数组,但我敢肯定有一种方法可以获得相同的结果:单个长字符向量。一旦你得到它,fprintf 将它写入文件会非常快。

注意:如果数据量太大且内存有限,您可能无法生成长 char 向量。根据我的经验,在 chuncks(适合内存)中使用此方法比遍历矩阵的每一行更快。