【问题标题】:Trying to load mixed data from csv file and searching it尝试从 csv 文件加载混合数据并进行搜索
【发布时间】:2019-02-06 12:22:57
【问题描述】:

我在制表符分隔的 .tab 文件中混合了数据。第一列是(大)数字,第二列和第三列是(或可以被视为)文本。下面是一个例子,

9984847435  cheese  0
9984847438  start   100
9984849435  orange  100
9984847635  milk    0
9984847435  coffee  1
9984847835  three_blind_mice    1
9984847435  end 1
10000000123 juice   45
10000000124 start   point
10000000223 ramen_y cattle_ranch_65.jpg

现在我想将这些数据导入 matlab。然后我想按第 1 列对表格进行排序。然后我想搜索这些数据,例如返回第 2 列中有“开始”的行号(或行/列位置)。

我使用 readtable 将数据导入为表格。

data = readtable ('sheet.tab', 'Format', '%u64%s%s', 'ReadVariableNames',false);

dataSorted = sortrows(data,1);

%Get row numbers for start

entry = 1;

for i = 1 : height(dataSorted)

    if dataSorted(i,2) = 'start'

        rowNumbers (entry,1) = i

        entry+1

    end

end

我希望得到一个矩阵,列出第二列中有“开始”的行号。所以对于上面的例子,

rowNumbers = 

2
9

相反,我得到“等号左侧的表达式不是赋值的有效目标。”

【问题讨论】:

  • 我的错,这是一个错字。我的意思是一个单列矩阵。我只是一个初学者。数据确实是制表符分隔的,我已经编辑了我的帖子。

标签: matlab


【解决方案1】:

您不应该对字符串(或字符数组)进行相等比较,即使您可以(即当您进行数字比较时)您想要 == 而不是 =

改为使用strcmp

if strcmp( dataSorted(i,2), 'start' )
    % stuff
end

注意ismember这里更灵活,可以去掉整个循环,做

rowNumbers = find( ismember( dataSorted(:,2), 'start' ) );

编辑:

由于您使用的是表格,因此您需要对 dataSorted 进行索引,略有不同...

rowNumbers = find( ismember( dataSorted{:,2}, 'start' ) );
% or using dot notation, where the 2nd column heading is 'Var2'
rowNumbers = find( ismember( dataSorted.Var2, 'start' ) );

【讨论】:

  • 感谢您抽出宝贵时间,这很有帮助。但是,当我按照您的建议使用 ismember 时,我收到错误“A 和 B 必须都是表格”。使用strcmp (dataSorted(1,2), 'start') 会返回 0,因此如果我使用循环,它不会返回任何内容。我对格式和数据类型仍然有些困惑。
  • @shlabber 啊,我在考虑数组,而不是表格...您可以改用dataSorted{:,2},或dataSorted.Column2Name - 我会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多