WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Dateien zusammenfügen, wenn die Namen übereinstimmen

 

wgttzs!
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 02.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.01.2022, 22:52     Titel: Dateien zusammenfügen, wenn die Namen übereinstimmen
  Antworten mit Zitat      
Liebe Gomatlab Gemeinde,

ich habe zwei Pfade aus denen ich Dateien einlese. Wenn die ersten drei Buchstaben übereinstimmen. Dann sollen die Dateien zusammengefügt werden. Nur leider funktioniert das ganz und gar nicht. Stattdessen werden die alten Dateien abgelegt und gespeichert. Wie komme ich das am besten hin?

Code:

folder_ex = dir('C:\_ex\*.mat'); %Pfad 1
files_ex = {folder_ex.name};

folder_seq = dir('C:\_seq\*.mat'); %Pfad 2
files_seq = {folder_seq.name};

%Dateien werden zusammengefügt
for k_1=1:numel(files_ex)
    x=find(strncmpi(files_ex.Finale_Datei,files_seq{k_1},3));
    n=numel(x);
   
   
    for k_2 = 1:n
        save (fullfile('C:\_merged',(extractBefore(files_ex{k_1}, ".") + "_merged")))
    end

end
 
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.01.2022, 10:23     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Dann sollen die Dateien zusammengefügt werden.

Heißt was genau? Die Dateien enthalten verschiedene Variablen, und die Ergebnisdatei soll alle enthalten? Oder enthalten sie Variablen gleichen Namens, die verkettet werden sollen? Oder eine Kombination von beidem? Oder was ganz anderes?

Zitat:
Nur leider funktioniert das ganz und gar nicht.

Und das heißt? Was erwartest du, was passiert stattdessen? Gerade wenn man den Code nicht selbst laufen kann, ist es wichtig, dass du das genau beschreibst.
Im Debugging-Modus kannst du Schritt für Schritt den Code durchgehen und in jedem Schritt schauen, was passiert.

Ein Problem sehe ich schon mal: mit save werden nur Variablen gespeichert, die im Workspace liegen. Du musst also die Inhalte der .mat-Dateien erst mal laden.

Wenn die Dateien in den Pfaden automatisch generiert werden, kann es einfacher und effizienter sein, auch die zusammengeführten Dateien direkt mit zu generieren.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
wgttzs!
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 02.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.01.2022, 16:39     Titel:
  Antworten mit Zitat      
Vielen Dank für die Antwort!
Die Dateien von ex (liegt als Finale-Datei als table vor) enthalten zwei Spalten und die Dateien von seq (liegen als double vor) eine Spalte. Alle drei Spalten sind gleich lang. Die Dateien für ex werden in einem anderem Skript vorher generiert. Hier ist der Code dafür:
Code:

folder = dir('C:\*.mat');
files = {folder.name};

Finale_Datei=zeros(432,3);

for k=1:numel(files)
   
    [s,headerlinesOut]=importdata(files{k});
    Finale_Datei=s(:,[1,10]);
   
    save (fullfile('C:\_ex',(extractBefore(files{k}, ".") + "_ex")))
end

 


Für das Skript in dem die Dateien zusammengesetzt werden, deren ersten drei Buchstaben gleich sind, habe ich mich an dem Code orintiert:https://de.mathworks.com/matlabcentral/answers/553771-merge-files-with-the-same-prefix
Dort verstehe ich alles bis zur zweiten for Schleife.

Code:
folder_ex = dir('C:\_ex\*.mat');
files_ex = {folder_ex.name};

folder_seq = dir('C:\_seq\*.mat');
files_seq = {folder_seq.name};

%Dateien werden zusammengefügt
for k_1=1:numel(files_ex)
    x=find(strncmpi(files_ex,(files_seq{k_1}),3));
    n=numel(x);
    a=cell(n);  
   
    for k_2 = 1:n
        save (fullfile('C:\_merged',(extractBefore(files_ex{k_1}, ".") + "_merged")))
    end
    m=vercat(a{:});
   

end
 


Bis a=cell(n); hier funktioniert auch alles wie es sollte und bis dahin steige ich selbst noch durch.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.01.2022, 17:53     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Die Dateien von ex (liegt als Finale-Datei als table vor) enthalten zwei Spalten und die Dateien von seq (liegen als double vor) eine Spalte. Alle drei Spalten sind gleich lang.

D.h. beide .mat-Dateien enthalten genau 1 Variable? Nach deinem Code würde ich eher vermuten, dass dem nicht so ist.
Was soll nun das Ergebnis sein? Ein Table mit 3 Spalten oder eine Matrix mit 3 Spalten? Wie soll diese Variable heißen?

Kann es sein, dass zu einer Datei aus _seq mehrere aus _ex gehören bzw. umgekehrt? Falls nicht, brauchst du keine zweite Schleife. Es ist jedenfalls nicht sinnvoll, die Schleife über k_2 laufen zu lassen und k_2 darin nicht zu verwenden.

Wie sich das "nicht funktionieren" nun äußert, weiß ich immer noch nicht.

Was wie gesagt fehlt ist das Laden der Daten.

Grundsätzlich wäre meine Empfehlung, die Vorgehensweise für ein Dateien-Paar zum Laufen zu bekommen und das dann über eine for-Schleife zu erweitern.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
wgttzs!
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 02.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.01.2022, 18:58     Titel:
  Antworten mit Zitat      
Zitat:
Wie sich das "nicht funktionieren" nun äußert, weiß ich immer noch nicht.


Es äußert sich dadurch, dass ich am Ende zwar alle Dateien ausgeben habe, aber die 1 zu 1 mit denen _ex Dateien übereinstimmen

Zitat:
D.h. beide .mat-Dateien enthalten genau 1 Variable? Nach deinem Code würde ich eher vermuten, dass dem nicht so ist.
Was soll nun das Ergebnis sein? Ein Table mit 3 Spalten oder eine Matrix mit 3 Spalten? Wie soll diese Variable heißen?


Das Ergebnis soll ein Table sein mit den ersten drei Buchstaben, die bei beiden Dateien (_ex Dateien(432,2) und _seq(432,1)) gleich sind und mit der Endung _merged.

Zitat:

Kann es sein, dass zu einer Datei aus _seq mehrere aus _ex gehören bzw. umgekehrt? Falls nicht, brauchst du keine zweite Schleife. Es ist jedenfalls nicht sinnvoll, die Schleife über k_2 laufen zu lassen und k_2 darin nicht zu verwenden.


Jeweils eine Datei von _seq gehört zu einer anderen _ex Datei
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.01.2022, 22:00     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Das Ergebnis soll ein Table sein mit den ersten drei Buchstaben, die bei beiden Dateien (_ex Dateien(432,2) und _seq(432,1)) gleich sind und mit der Endung _merged.

Na, dann musst du den Table auch irgendwann erstellen. Wobei ich die Table-Variable generisch nennen würde und nur die .mat-Datei , in die du den Table schreibst, abhängig von den Daten. Und dazu musst du (immer noch) erst mal die .mat-Dateien importieren. Auch wäre es gut, diese ersten drei Buchstaben mal zu extrahieren.

Zitat:
Jeweils eine Datei von _seq gehört zu einer anderen _ex Datei

Dann brauchst du wie gesagt keine for-Schleife, sondern kannst direkt
Code:
files_ex{x}

weiterverwenden.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
wgttzs!
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 02.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.01.2022, 23:14     Titel:
  Antworten mit Zitat      
Ich habe versucht alles was du schreibst abzuarbeiten:

Ich habe von beiden Dateien Tables und habe alle überflüssigen for Schleifen rausgeschmießen.
Code:
folder_ex = dir('C:\*.mat');
files_ex = {folder_ex.name};

folder_seq = dir('C:\_seq\*.mat');
files_seq = {folder_seq.name};


Finale_Datei=zeros(431,3);

for k=1:numel(files_ex)
   
    x=find(strncmpi(files_ex,(files_seq{k}),3));
     
    [s,headerlinesOut]=importdata(files_ex{k});
    Finale_Datei=vertcat(s(:,[1,10]),b(:,1));
   
   
   
    files_ex{x};

end


Ich bekomme aber folgende Fehlermeldung All tables being vertically concatenated must have the same number of variables. Obwohl beide Dateien (431,1) und (431,2) genauso lang sind. Kann ich am Ende alle Dateien zusammenfügen? Also jeweils die zwei Spalten und dazu die dritte und am Ende für alle Dateien im Ordner?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.01.2022, 10:43     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Obwohl beide Dateien (431,1) und (431,2) genauso lang sind.

Variablen, nicht Dateien. Vor allem aber hilft das nichts, wenn du sie vertikal, also untereinander verkettest. Du müsstest sie horizontal verketten, also horzcat.

Die Weiterverwendung von files_ex{x} besteht schon in mehr als copy-paste und ;. Du musst diese Datei importieren. Die erste zu importierende Datei sollte m.E. files_seq{k} sein, weil du mit dem find-Befehl ja nach der passenden _ex - Datei dazu suchst.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
wgttzs!
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 02.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2022, 13:04     Titel:
  Antworten mit Zitat      
Code:
for k=1:numel(files)
   
    [b]=importdata(files_seq{k});
    [s]=importdata(files{k});
    x=find(strncmpi(files,(files_seq{k}),4));
   
    for m=1:numel(x)
    %muss hier nicht eine Schleife dazwischen
    Finale_Datei=horzcat(s(:,[1,10]),b(:,1));
    %hier muss der richtige Name rein
    end  
   
   
end


Vielen Dank!
Aber wieso brauche ich keine zweite Schleife? Ich zähle dann 52 Dateien, die ich um eine Spalte ergänze. Diese müsste ich dann noch zu einer Datei machen mit vertcat
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.01.2022, 14:21     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Aber wieso brauche ich keine zweite Schleife?

Weil du zu jeder Datei in einem Verzeichnis genau eine passende im anderen hast. Es reicht also vollkommen, über die Dateien in einem Verzeichnis zu iterieren.

Wieso hast du jetzt auf einmal files statt files_ex?

Wichtig ist, dass du immer die passende Datei importierst. Zusammen mit anderen Anpassungen also:
Code:
for k=1:numel(files_seq)
    x=find(strncmpi(files,(files_seq{k}),4));
    [b]=importdata(files_seq{k});
    [s]=importdata(files{x});
   
    Finale_Datei=horzcat(s(:,[1,10]),b(:,1));
    newName = files_seq{k}(1:4) + "_merged";
    save(newName, "Finale_Datei");  
end


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
wgttzs!
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 02.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2022, 17:37     Titel:
  Antworten mit Zitat      
Zitat:
Wieso hast du jetzt auf einmal files statt files_ex?


Da ich ja mit import gleich die passenden Spalten raussuche, muss ich nicht mehr die "umgewandelten" _ex files mehr nehmen.

[code]Finale_Datei=horzcat(s(:,[1,10]),b(:,1)); [/code

Kann ich nach der Zeile gleich nochmal alle merged Dateien zusammenfügen zu einer Datei oder brauche ich dafür nochmal eine for Schleife?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.01.2022, 17:40     Titel:
  Antworten mit Zitat      
Hallo,

die Frage ist, was du nun unter diesem "zusammenfügen" verstehst. Wenn es ein Untereinanderhängen der Daten ist:

vor der Schleife:
allContent = [];

in der Schleife:
allContent = [allContent; Finale_Datei];

nach der Schleife:
% abspeichern von allContent

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
wgttzs!
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 02.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2022, 19:14     Titel:
  Antworten mit Zitat      
Vielen, vielen Dank! Ich konnte jetzt sogar den Code noch weiter ausbauen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.