【问题标题】:Saving a string array to CSV将字符串数组保存到 CSV
【发布时间】:2021-06-19 02:46:33
【问题描述】:

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

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

我做错了什么?

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

【问题讨论】:

  • 不要像现在这样将列合并到字符串数组中,而是将它们作为单独的参数提供,并遍历s1的行:fprintf(fileID, '%s,%s\n', s1(k,1), s1(k,2));

标签: arrays string matlab export-to-csv


【解决方案1】:

不要像现在这样将列合并为字符串数组,而是将它们作为单独的参数提供,并循环遍历 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');

【讨论】:

  • 谢谢。现在试试这个。这是一个非常大的矩阵,因此循环可能需要一些时间。如果它一旦完成,我会接受答案。
  • @phdstudent 不确定它是否更快,但您也可以使用writematrix
【解决方案2】:

我的 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 中使用这种方法仍然更快(这将适合内存),而不是循环遍历矩阵的每一行。

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 2014-01-04
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多