【发布时间】:2014-09-16 11:44:34
【问题描述】:
我正在使用 Matlab 读取 CSV 文件;该文件可以包含我想转换为 0 的空值
FID=fopen('/file.txt','r');
text_line = fgetl(FID);
C = textscan(text_line,'%d','delimiter',',','EmptyValue', 0);
如果空值在行的中间,例如
5,,6
一切正常,变量 C 获取
5 0 6
作为价值观。如果空值在末尾,例如
5,6,
Matlab 无法识别它并且 C 变量得到了
5 6
作为值,而不是
5 6 0
在丹尼斯回答后编辑: 我不明白为什么需要预期的元素数量,我给出了分隔符,难道还不够吗?无论如何,我尝试了,结果不同:使用 %d%d%d 我得到了
C =
[5] [0x1 int32] [6]
%d 一切都在第一个元素中,所以
C{1}
ans =
5
0
6
此代码 sn-p 是将一个非常大的 CSV 矩阵导入 matlab 稀疏矩阵的过程的一部分(请参阅我的帖子 Handling a very big and sparse matrix in Matlab),我猜(尚未尝试)第一种方法更快。
无论如何,我的值实际上是每行 >290k,所以我想指定所有 %d 不是一个可行的选择
【问题讨论】:
-
使用 fscanf 的 textscan 会更简单
-
如果您的所有值都是数字,您可以使用 csvread - 它可能会更好。您还可以检查导入数据。不幸的是abandonmatlab.wordpress.com/2012/08/07/…
-
我认为 csvread 速度较慢,无论如何我尝试使用矩阵的一小部分,但发生了一些奇怪的事情:如果列数 > 100k,则仅使用一列创建矩阵并且所有值分布在行中。我不明白为什么。 M = csvread('file.csv')