将字符串数组保存为 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(适合内存)中使用此方法比遍历矩阵的每一行更快。
我有一个 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(适合内存)中使用此方法比遍历矩阵的每一行更快。