【问题标题】:How to read csv files in matlab as you would in R?如何像在 R 中一样在 matlab 中读取 csv 文件?
【发布时间】:2013-01-23 20:24:13
【问题描述】:

我有一个保存为 .csv 文件的数据集,如下所示:

Name,Age,Password
John,9,\i1iiu1h8
Kelly,20,\771jk8
Bob,33,\kljhjj

在 R 中,我可以通过以下方式打开此文件:

X = read.csv("file.csv",header=TRUE)

Matlab 中是否有一个默认命令可以读取带有数字和字符串变量的 .csv 文件? csvread 似乎只喜欢数字变量。

更进一步,在 R 中,我可以使用附加函数来创建与数据集的列和列标题相关联的变量,即,

attach(X)

Matlab中有类似的吗?

【问题讨论】:

  • import csv to matlab with mixed data types 的完全相同的副本。
  • 最后一部分是对 attach 在 R 中所做的一个微妙但重要的误解。它只将列名暴露给封闭环境。区别是至关重要的,因为在执行detach(X) 时,对这些变量的更改不会持续存在。不鼓励使用attach
  • @NathanG 我同意这 close 是完全重复的 - 但我不认为这是准确的,因为额外的问题询问将标题附加到数据集。无论如何,我选择提供答案,因为我个人会使用textscan 来解决这个问题,而不是xlsread。链接的答案提供的关于textscan 的信息非常少——实际上只是一个文档链接。

标签: r matlab csv import-from-csv


【解决方案1】:

虽然这个问题几乎完全重复,但@NathanG 提供的链接中建议的解决方案(即使用xlsread)只是解决问题的一种可能方法。链接中的作者还建议使用textscan,但没有提供任何有关如何操作的信息,所以我想在这里添加一个示例:

%# First we need to get the header-line
fid1 = fopen('file.csv', 'r');
Header = fgetl(fid1);
fclose(fid1);

%# Convert Header to cell array
Header = regexp(Header, '([^,]*)', 'tokens');
Header = cat(2, Header{:});

%# Read in the data
fid1 = fopen('file.csv', 'r');
D = textscan(fid1, '%s%d%s', 'Delimiter', ',', 'HeaderLines', 1);
fclose(fid1);

Header 现在应该是单元格的行向量,其中每个单元格都存储一个标题。 D 是单元格的行向量,其中每个单元格存储一列数据。

我不知道将D“附加”到Header。如果你愿意,你可以把它们放在同一个结构中,即:

S.Header = Header;
S.Data = D;

【讨论】:

  • 您可以通过使用元胞数组并将标题作为元胞数组的第一行来“附加”它们,就像在 .csv 文件中所做的那样。我这样做的唯一一次是当我要将生成的单元格数组写入 Excel 时。在其他情况下可能看起来微不足道,但我认为值得注意。
【解决方案2】:

Matlab 的新表格类使这变得简单:

X = readtable('file.csv');

默认情况下,这将解析标题,并将它们用作列名(也称为变量名):

>> x

x = 

 Name      Age     Password  
_______    ___    ___________

'John'      9     '\i1iiu1h8'
'Kelly'    20     '\771jk8'  
'Bob'      33     '\kljhjj' 

您可以使用其名称等选择一列:

>> x.Name

ans = 

    'John'
    'Kelly'
    'Bob'

自 Matlab 2013b 起可用。 见www.mathworks.com/help/matlab/ref/readtable.html

【讨论】:

    【解决方案3】:

    我喜欢这种方法,得到 Matlab 2012 的支持。

    path='C:\folder1\folder2\';
    data = 'data.csv';
    data = dataset('xlsfile',sprintf('%s\%s', path,data));
    

    当然,您还可以执行以下操作:

    [data,path] = uigetfile('C:\folder1\folder2\*.csv');
    data = dataset('xlsfile',sprintf('%s\%s', path,data));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2020-01-30
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多