Hi,
as usual i have an error in my code. I import several files, from which I get my first string (SP_RL). Just as an example it looks like this:
SP_RL=["A","B","B","C";"E","F","F","G"]
My script should now delete the double values in every row and should rewrite it into another format like this:
iwant=["a,b,c";"e,f,g"]
So I add two example files and my code. Because I dont find the error, which overwrites the "iwant" string after every file.
directory_name=uigetdir('','Ordner mit Messungen auswählen');
[nur_file_name,pfad]=uigetfile({'*.xlsx','xlsx (*.xslx)';'*.*','all Files'},...
'Die xslx-Files oeffnen (probe_001.xlsx=',[directory_name '/'], 'Multiselect', 'on');
nur_file_name=cellstr(nur_file_name);
nur_file_name=sort(nur_file_name);
filename=strcat(pfad,nur_file_name);
anzahl_files=size(filename,2);
for xy=1:anzahl_files
fid_in=fopen(char(filename(xy)),'r');
tmpImport = importdata(filename{xy},',');
SP_RL = tmpImport.Tabelle1;
SP_RL = regexprep(SP_RL,'\''','');
SP_RL = regexprep(SP_RL,'\+','');
SP_RL= regexprep(SP_RL, '\d+(?:_(?=\d))?', '');
[anzahl_zeile,anzahl_elemente]=size(SP_RL);
SP_RL=string(SP_RL);
%---------------------In the following is the error:
for x=1:anzahl_zeile
iwant(x,:) = join(unique(split(string(SP_RL(x,:)))),',');
end
iwant=strip(iwant,'left',",");
iwant=strip(iwant,'right',",");
end
I appreciate any help. Thank you.

댓글 수: 1

A = ["A","B","B","C";"E","F","F","G"]
A = 2×4 string array
"A" "B" "B" "C" "E" "F" "F" "G"
B = cellfun(@(s)join(unique(s),','),num2cell(A,2))
B = 2×1 string array
"A,B,C" "E,F,G"

댓글을 달려면 로그인하십시오.

답변 (1개)

Karim
Karim 2022년 7월 12일

0 개 추천

In the for loop, 'x' starts from 1, hence you will overwrite the data in iwant for each new file.
One method to resolve this is to store the data (i.e. "iwant') temporary in a cell array and append al the data at the end of the routine. See below for this method.
MyFiles = ["Smp_1_1_4_2021_11_05_11h41m37s_Zusammensetzung.xlsx"
"Smp_1_1_8_2021_11_05_11h54m49s_Zusammensetzung.xlsx"];
% create a temporary storage for the data from each file, append to one big
% string array in the end
tmpCell = cell(length(MyFiles),1);
for i = 1:length(MyFiles)
tmpImport = importdata(MyFiles(i),',');
SP_RL = tmpImport.Tabelle1;
SP_RL = regexprep(SP_RL,'\''','');
SP_RL = regexprep(SP_RL,'\+','');
SP_RL = regexprep(SP_RL, '\d+(?:_(?=\d))?', '');
[anzahl_zeile,anzahl_elemente] = size(SP_RL);
SP_RL = string(SP_RL);
for x = 1:anzahl_zeile
iwant(x,:) = join(unique(split(string(SP_RL(x,:)))),',');
end
iwant = strip(iwant,'left',",");
iwant = strip(iwant,'right',",");
tmpCell{i} = iwant;
end
iwant = vertcat(tmpCell{:})
iwant = 28104×1 string array
"Ag,As,Cd,Co,Cr,Cs,Cu,Dy,Er,Fe,Ga,Gd,Ge,Hf,Hg,I,K,Kr,Mg,Mn,Mo,Na,Ni,Os,P,Pb,Pt,Rb,Ru,Sc,Se,Si,Sn,Sr,Te,Tl,U,V,W,Xe,Yb,Zn,Zr" "Cr,Cs,Fe,Ga,Ge,K,Kr,Mg,Mn,Na,Ni,P,Rb,Sc,Si,Sr,V,Zn" "Al,Ba,Ce,Cl,Ga,Ge,K,La,Na,P,Rb,Sc,Si,Xe" "Al,Ba,Cd,Ce,Fe,Ga,Ge,K,La,Na,Nd,Ni,Os,P,Pd,Pt,Rb,Sc,Se,Si,Sn,Sr,Ta,W,Xe" "Al,Ca,Kr,Lu,Na,Rb,Sc,Si,Sr" "Al,Ba,Ca,Ce,Dy,Ga,Kr,La,Na,Rb,Sc,Si,Sr,Xe" "Al,Ca,Na,Sc,Si,Sr" "Al,Ba,Cd,Ce,Cl,Cr,Cu,Dy,Er,Fe,Ga,Gd,Ge,Hf,Hg,Ho,Ir,K,La,Lu,Mo,Na,Nd,Ni,Pb,Pd,Pr,Rb,S,Se,Ta,Th,V,W,Xe,Yb,Zr" "Al,Ba,Cs,Dy,Eu,Fe,Ga,Na,Nd,Os,Sc,Sm,Sn,W" "Al,Na,Nd,V" "Al,Ge,Na,Se" "Al,In,Kr,Na,Se,Sn,Tb" "Na,Sc,Si,Sn,Te,Tl" "Na,Sc,Si,Sn,Te,Xe" "As,Ba,Ce,Co,Cr,Cs,Cu,Dy,Fe,Ga,Gd,Ge,Hf,Hg,K,Kr,La,Mo,Na,Nd,Ni,Os,P,Pb,Pt,Rb,Ru,S,Sc,Se,Si,Sr,Te,Tl,V,W,Xe,Yb,Zr" "Cd,Cr,Cs,Ga,K,Na,Os,P,Pt,Rb,Sc,Si,Sn,Sr,Te,Tl,V,W,Xe" "Cd,Cr,Cs,Fe,Ga,Gd,Ge,K,Na,P,Rb,Sc,Se,Si,Sm,Sn,Tl" "Dy,Er,Ga,Na,P,Sc,Si,V" "Au,Cd,Fe,Ga,K,Na,Rb,Sc,Si,Sn,Sr,Te,Tl,U,V" "Ba,Ce,Cr,Eu,Fe,Ga,Gd,Ge,Hg,K,La,Na,Ni,Pb,Rb,Sc,Si,Sm,Sr,Tl,Xe" "Au,Ca,Eu,Na,Si,Sr" "As,Ca,Cd,Ce,Cr,Dy,Fe,Gd,Ge,Hg,In,Na,Nb,Ni,Os,Pb,Pd,Pt,Sb,Si,Sm,Sn,Ta,Te,Ti,Tl,U,V,W,Xe,Zn" "Ba,Hg,Na,Ru,Si,Te,Xe" "Na,Si" "Ba,Ce,Cr,Dy,Eu,Fe,Ga,Gd,Ge,Hg,Kr,La,Na,Nd,Ni,Pb,Pd,Pr,Pt,Rb,Sc,Si,Sm,Sn,Sr,Te,Tl,Xe" "Ba,Ce,Cl,Cr,Fe,Ge,Hg,In,K,La,Na,Ni,P,Pb,Rb,S,Se,Sn,Sr,Tl" "Ba,Ce,Cr,Fe,Ga,Ge,In,K,La,Na,Ni,P,Pb,Rb,Re,Ru,S,Se,Sn,Tl,Xe" "Ba,Cr,Fe,Ge,Hg,Kr,Na,Ni,P,Se,Tl" "Dy,Er,Na,P" "Ag,Ba,Bi,Ce,Cr,Dy,Fe,Gd,Ge,Hg,La,Na,Ni,Pb,Rb,S,Se,Sr,Te,Xe"

댓글 수: 4

Tatjana Mü
Tatjana Mü 2022년 7월 12일
Thank you really much. How do I define "Myfiles" in my code, if the names of the files are always different?
Just like you showed in your original post (see below). The only reason, i changed these lines of code was to let the code run on the forum.
length(MyFiles) is the same as anzahl_files in your code.
directory_name=uigetdir('','Ordner mit Messungen auswählen');
[nur_file_name,pfad]=uigetfile({'*.xlsx','xlsx (*.xslx)';'*.*','all Files'},...
'Die xslx-Files oeffnen (probe_001.xlsx=',[directory_name '/'], 'Multiselect', 'on');
nur_file_name=cellstr(nur_file_name);
nur_file_name=sort(nur_file_name);
filename=strcat(pfad,nur_file_name);
anzahl_files=size(filename,2);
for xy=1:anzahl_files
Hi Sorry I cant see your full comment.
If I change My files to anzahl_files I just get errors:
tmpCell = cell(length(anzahl_files),1);
for i = 1:length(anzahl_files)
tmpImport = importdata(filename(i),','); %Not working
SP_RL = tmpImport.Tabelle1;
SP_RL = regexprep(SP_RL,'\''','');
SP_RL = regexprep(SP_RL,'\+','');
SP_RL = regexprep(SP_RL, '\d+(?:_(?=\d))?', '');
[anzahl_zeile,anzahl_elemente] = size(SP_RL);
SP_RL = string(SP_RL);
for x = 1:anzahl_zeile
iwant(x,:) = join(unique(split(string(SP_RL(x,:)))),',');
end
iwant = strip(iwant,'left',",");
iwant = strip(iwant,'right',",");
tmpCell{i} = iwant;
end
iwant = vertcat(tmpCell{:})
I get an error:
Error using importdata (line 139)
Unable to open file.
Error in TOF_SP_Minerale (line 87)
tmpImport = importdata(filename(i),',');
That's because filename in your case is a cell array, try indexing it with curly brackets like this:
tmpImport = importdata(filename{i},',');

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Characters and Strings에 대해 자세히 알아보기

질문:

2022년 7월 12일

댓글:

2022년 7월 12일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by