字符串比较和删除元素

时间:2017-04-09 15:09:57

标签: matlab equals string-comparison

我有一个由N-by-M表组成的csv文件。 在第一列中每行由6个不同的数字组成,我需要检测是否有任何数字是相同的,然后打印错误消息 这就是我认为应该写的方式

   valid=true(height(Information),1);
for i=1:height(Information),1;
    if Information{i, 1} == Information{:, 1}
        fprintf('Invalid number in line %d', i);
        valid(i)=false;
    end
end

4 个答案:

答案 0 :(得分:1)

使用uniquehistcounts的第三个输出:

% generate two matrices, one with 2 identical elements
A1 = rand(3);
A1(end,1) = A1(1);
A2 = rand(3);
% check identical elements
[~,~,ic] = unique(A1(:,1),'stable');
identicalNumbers = any(histcounts(ic,max(ic)) > 1) % true
[~,~,ic] = unique(A2(:,1),'stable');
identicalNumbers = any(histcounts(ic,max(ic)) > 1) % false

编辑它可以更简单地完成:

identicalNumbers = numel(ic) > max(ic)

答案 1 :(得分:0)

首先在名为A的矩阵中读取csv文件,然后尝试以下代码:

    uniqueVals = unique( A(:,1) );% find unique values of col 1
    [r c] = size(uniqueVals);% r determines the number of unique values in A(:,1)
    [rr cc] = size(A);% rr is total number of values in A(:,1)
    if (r~=rr)
        disp('identical numbers detected');
    end

答案 2 :(得分:0)

我修改了我的代码。以下代码检测第一列中的相同数字并告诉您索引:

    A = randi (8,6)
    uniqueVals = unique( A(:,1) );
    [c r] = size(uniqueVals);
    for i=1:c
        [m n]= size(find(A(:,1) == uniqueVals(i)));
        if m>1
            disp('same values detected in rows: ')
            find(A(:,1) == uniqueVals(i))
       end
    end

检查代码并给我反馈。

答案 3 :(得分:0)

我已在本地驱动器中下载了您的csv文件。运行代码并使用对话框选择csv文件。

clear
clc
[file_name, mach_path] = uigetfile( ...
{'*.csv', 'All CSV (*.csv)'}, ...
'Select File');

% If "Cancel" is selected then return
 if isequal([file_name,mach_path],[0,0])
    return

 % Otherwise construct the fullfilename and Check and load the file
 else
        fileName = fullfile(mach_path,file_name);
 end 
 fid = fopen(fileName,'r');   %# Open the file
  lineArray = cell(100,1);     %# Preallocate a cell array (ideally slightly
                           %#   larger than is needed)
  lineIndex = 1;               %# Index of cell to place the next line in
  nextLine = fgetl(fid);       %# Read the first line from the file
  while ~isequal(nextLine,-1)         %# Loop while not at the end of the file
    lineArray{lineIndex} = nextLine;  %# Add the line to the cell array
    lineIndex = lineIndex+1;          %# Increment the line index
    nextLine = fgetl(fid);            %# Read the next line from the file
  end
  fclose(fid);                 %# Close the file
  lineArray = lineArray(1:lineIndex-1);  %# Remove empty cells, if needed
  for iLine = 1:lineIndex-1              %# Loop over lines
    lineData = textscan(lineArray{iLine},'%s',...  %# Read strings
                    'Delimiter',',');
   lineData = lineData{1};              %# Remove cell encapsulation
    if strcmp(lineArray{iLine}(end),',')  %# Account for when the line
      lineData{end+1} = '';                     %#   ends with a delimiter
    end
    lineArray(iLine,1:numel(lineData)) = lineData;  %# Overwrite line data
  end
A = lineArray;
uniqueVals = unique( A(:,1) );
[cc ~] = size(uniqueVals);
for i=1:cc
[mm ~]= size(find(ismember(A(:,1),uniqueVals(i))));
   if mm>1
    second = find(ismember(A(:,1),uniqueVals(i)));
        disp('same value detected in rows: ')
        disp(second(2));
    A(second(2),:) = [];
    disp(A);
   end
end