【问题标题】:How can I get around MATLAB's specifications of csvread?如何绕过 MATLAB 的 csvread 规范?
【发布时间】:2015-09-09 23:33:32
【问题描述】:

我正在尝试创建一个接收多个 csv 文件的程序。但是,它们包括字符串和数字。 我的 csv 文件看起来像这样:

    "Project","Task","Value Type", "Value"
    "105", "06.05.02", "cost", "3434"
    "105", "06.05.02", "obligation", "3434"
    "106", "06.05.02", "cost", "500"
    "106", "06.05.02", "obligation", "500"

列数是固定的(实际上有 23 个,为了便于阅读,我只列出了 4 个),但是每个 csv 的行数不同。如果我将它保存为 xls 文件,它可以完美运行。但是,如果有很多文件并且最终用户不想处理它,这将花费太长时间。

类似的问题建议textread,但第一行应该是

    textread('filename.csv', '%s%s%s%s', 'delimiter', ',');

而文件的其余部分是

    textread('filename.csv', '%f%s%s%f', 'delimiter', ',');

与使用xlsread 在相应数组中获取数字、字符串和原始数据的简单性相比,拥有 23 个不同的数组似乎有点复杂。

这里最好的解决方案是什么? 文件很大,但不够大,我担心效率。

有没有办法在我的程序中将文件的扩展名从 .csv 更改为 .xls? (我也查了这个,但找不到任何有用的东西)我真的很想使用xlsread,但如果这不可能,有没有办法让textread 保存第一行csv 具有某些变量类型(%s%s%s%s),然后使用不同的变量类型(%f%s%s%f)保存其余行?

【问题讨论】:

  • @EliAlgranti - readtable 仅适用于 MATLAB R2013b+。 OP 可能没有更新版本的 MATLAB。
  • 看这个之前的帖子[read_mixed_csv][1][1]:stackoverflow.com/questions/4747834/…
  • 无论如何,您都必须将textread(...) 行放在一个循环中,那么为什么不在循环之前调用您的标题textread,然后在循环内使用您的第二个textread 获取数据呢?
  • 谢谢,其中一些似乎可行。我错误地使用了textread,我认为由于 MATLAB 是基于矩阵的,因此我不需要使用循环,只需自动获取每一列。那么.. 有没有办法从 MATLAB 中将 .csv 更改为 .xls?我真的很想使用xlsread 一次保存所有数据要简单得多!

标签: matlab csv


【解决方案1】:

xlsread 确实读取csv文件,所以应该不需要转换。直接读取即可(在 2013b 上测试了一个混合数字和字符串数据的小文件):

[num, text, alldata] = xlsread('test.csv')

注意:这显然只适用于 Windows 机器。如果只是更改扩展名使xlsread 为您工作,您可以使用movefile 重命名:

oldfile = somefile.csv;
ext = 'xls';
[~, name, ~ ] = fileparts(oldfile);
newfile = [name,ext];
movefile(oldfile,newfile);

如果您有很多文件,这将进入一个循环,oldfile 将从类似 dirls 命令的输出中获取,为您提供所有 .csv 文件。

顺便说一句,虽然您可能会在较早的问题中看到它,但现在不建议使用 textread,而是在您需要对输入进行更复杂/控制的情况下使用 textscan。它可能非常强大,但在这种情况下可能就像用大锤敲碎坚果一样。

如果您不需要标题,例如,您可以将整个文件放在一行中:

C = textread('filename.csv', '%f%s%s%f', 'Delimiter', ',','HeaderLines',1);

【讨论】:

  • 尝试读取csv 文件时,我收到此错误:Error using xlsread (line 247) Unable to read XLS file SUMMARY_EXPORT.csv. File is not in recognized format. 如果我手动将扩展名更改为.xlsxlsread 工作正常。
  • 我试过这个,但每一行都保存在一个列中,而不是组成每行的 23 个组成列。我认为从不同程序导出的文件有些奇怪。如果我在 Excel 中打开它们,然后使用 Text Wrangler 重新打开它们,每个值周围的引号就会消失。这是一个问题,因为某些值包含逗号,即分隔符。无论如何,我想问题是我的文件,而不是 MATLAB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多