Arrays 将字符串数组保存到CSV

Arrays 将字符串数组保存到CSV,arrays,string,matlab,export-to-csv,Arrays,String,Matlab,Export To Csv,我有一个25194081x2的字符串矩阵,叫做s1。下面是数据的外观 我正在尝试将此矩阵保存到csv。我尝试了下面的代码,但出于某种原因,它将向量的第一列保存两次(并排),而不是两列 我做错了什么 fileID= fopen('data.csv', 'w') ; fprintf(fileID, '%s,%s\n', [s1(:,1) s1(:,2)]); fclose(fileID) 不要像现在这样将列合并到字符串数组中,而是将它们作为单独的参数提供,并在s1的行上循环: fileID=

我有一个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');

不要像现在这样将列合并到字符串数组中,而是将它们作为单独的参数提供,并在
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)还没有可用的
字符串类型,但您的问题是我经常遇到的字符向量单元数组的问题。我用来避免对
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中使用这种方法(可以放在内存中)比在矩阵的每一行上循环更快。

我的MATLAB版本(R2016a)还没有可用的
字符串类型,但你的问题是我经常遇到的字符向量单元数组的问题。我用来避免对
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中使用此方法(可以放入内存)比在矩阵的每一行上循环更快。

不要像现在这样将列合并到字符串数组中,而是将它们作为单独的参数提供,并在
s1
的行上循环:
fprintf(fileID,'%s,%s\n',s1(k,1),s1(k,2))
不要像现在这样将列合并到字符串数组中,而是将它们作为单独的参数提供,并在
s1
的行上循环:
fprintf(fileID,'%s,%s\n',s1(k,1),s1(k,2))谢谢。现在试试这个。这是一个非常大的矩阵,所以循环可能需要一些时间。如果完成后它能工作,我将接受答案。@phdstudent不确定它是否更快,但您也可以使用
writematrix
谢谢。现在试试这个。这是一个非常大的矩阵,所以循环可能需要一些时间。如果完成后它能工作,我将接受答案。@phdstudent不确定它是否更快,但您也可以使用
writematrix