【问题标题】:Matlab doesn't recognize empty values at the end of a CSV file lineMatlab 无法识别 CSV 文件行末尾的空值
【发布时间】: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')

标签: matlab csv


【解决方案1】:

this answer on matlab central来看,你需要告诉Matlab你期望多少个值。

在你的情况下,我希望这会转化为:

FID=fopen('/file.txt','r');
text_line = fgetl(FID);
C = textscan(text_line,'%d%d%d','delimiter',',','EmptyValue', 0);

【讨论】:

  • 感谢您的回答,我已经编辑了我的问题并提供了更多详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
相关资源
最近更新 更多