2017-04-09 171 views
0

我有一個csv文件,它由N-M表組成。 在第一式柱的每一行包括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 

回答

0

首先讀出的在矩陣叫做A. csv文件,然後嘗試下面的代碼:的unique

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 
+0

我不能得到這個工作。 它不會在colum中檢測到相同的值,然後將其刪除並顯示錯誤消息 – Ryan

+0

您可以向我發送錯誤消息嗎? – Javidan

+0

我不知道如何把它寫proporly所以它不會搞砸 VAR1 VAR2 VAR3 VAR4 VAR5 Var6 'S123456' 'BN' 7 2 10 12 'S163765' '阿燕' 7 10 10 12 'S185216' 'Jyan' 4 2 -3 12 'S854789' '吉安' 7 2 7 7 'S325874' 'Zyan' 7 2 10 2 'S963256' 'Byan' 12 2 10 12 'S123456''名稱'7 2 4 4 'S214789''Hyan'10 7 10 12 – Ryan

1

使用第三輸出和histcounts

% 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) 
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 

檢查代碼並給我一個反饋。

+0

我真的很感謝你試圖幫助這麼多,但我想也許我不夠好解釋我的問題是什麼。 我有一個N-M表。 第一個柱是SXXXXXX第二個顯示名稱,其餘是單個數字。 我想只看看第一列的SXXXXXX,並檢查第一列中的任何字符串是否相同,如果是這種情況,它應該打印一條錯誤消息,其中第二個相同的數字出現在哪一行 然後行應該被刪除 – Ryan

+0

現在,我明白你要找的點。如果您在保存箱中製作csv文件的副本,則可以爲您編寫整個代碼。 – Javidan

+0

將您的csv放入文件共享網站並向我發送鏈接。我會做剩下的。 – Javidan

0

我在本地驅動器中下載了youe 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 
+0

如果我更改測試數據文件並使相同的數字在測試數據中出現更多,此代碼完全符合我希望它執行的任務文件,但感謝您的幫助我會嘗試瞭解它是如何工作的我欣賞您的所有評論,並努力幫助我解決問題 – Ryan

+0

歡迎您。如果要檢測第1列中相同數字不止兩次出現的情況,則需要修改「if mm> 1」主體中的代碼。 – Javidan

+0

爲什麼不可能寫第二個(i),因爲我遍歷整個數據集並檢測到任何相同的數字,然後改變它? – Ryan