在两个 csv 文件之间找到相同的行并用它们创建一个 Matlab 变量

Find identical lines between two csv files and create a Matlab variable with them

我有两个包含数字数据的 CSV 文件。

CSV-1:

1 -1 $c=2
5 6 -1 $c=8
6 -1 $c=2

CSV-2:

6 -1 $c=4
8 9 -1 4 $c=8
5 6 -1 $c=2
1 2 -1 3 $c=1

因此,CSV-1 有 3 行。 CSV-2 有 4 行。

我需要将这些文件读入 MATLAB,找到它们之间相同的行,然后将它们保存在一个数组中,例如 X = [6 -1; 5 6 -1].

** 我得到的数据集在每一行的末尾都有我无法删除的 $c 值。我需要相同系列的数字,但最后一部分是 $c 值。

假设 file1file2 分别是这些 CSV 文件的路径,您可以使用基于以下方法:

1) importdata(从 csv 文件导入数据)

2) strtrim(删除尾随空格)

3) intersect(获取公共线)

最终代码看起来像这样 -

%// Read in the CSV data as strings into cell arrays with each cell saving
%// one line from the files. Use strtrim to remove trailing whitespaces
csv1_data = strtrim(importdata(file1,'\n'))
csv2_data = strtrim(importdata(file2,'\n'))

%// Use intersect to find the common data (lines) for the desired output
X = intersect(csv2_data,csv1_data,'stable')

验证输入和结果 -

>> type(file1)

1 -1
5 6 -1 
6 -1 
>> type(file2)

6 -1
8 9 -1 4 
5 6 -1    
1 2 -1 3
>> X
X = 
    '6 -1'
    '5 6 -1'

如果您希望为每个相同的行分离出这些数字,您可以在那里再添加一行代码 -

Xcell = cellfun(@(x) strsplit(x),X,'uni',0);

因此,输出将如下所示 -

>> Xcell{1}
ans = 
    '6'    '-1'
>> Xcell{2}
ans = 
    '5'    '6'    '-1'

我尝试通过以下代码解决上述问题:

fid = fopen('csv-1.csv','r');
C = textscan(fid, repmat('%s',1,50), 'delimiter',' ', 'CollectOutput',true);
C = C{1};
fclose(fid);

for i = 1:length(C(1,:))
    index = find(strcmp(C(:,i),'$c')); %index of $c in every columns
if length(index) > 0
    C(index,i) = cellstr('0'); % masking $c with 0
    C(index,i+1) = cellstr('0'); % masking '=' with 0
    C(index,i+2) = cellstr('0'); % masking value with 0
end
end
C = num2cell( str2double(C)) ; 
C = cell2mat(C);  C(isnan(C)) = 0 ; %replacing all NaN with 0

同样将csv-2的数据保存到D中。最后:

identical_lines = length(intersect(C,D,'rows'))    

但是,这段代码执行起来很费时间。有没有其他方法可以快速解决这个问题