在两个 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 值。
假设 file1
和 file2
分别是这些 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'))
但是,这段代码执行起来很费时间。有没有其他方法可以快速解决这个问题
我有两个包含数字数据的 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 值。
假设 file1
和 file2
分别是这些 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'))
但是,这段代码执行起来很费时间。有没有其他方法可以快速解决这个问题