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

Mehrere txt-Files nach einer Liste von Worten durchsuchen

 

Plunder
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 14.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2013, 12:33     Titel: Mehrere txt-Files nach einer Liste von Worten durchsuchen
  Antworten mit Zitat      
Hallo zusammen,

ich würde mir gerne ein Skript bauen mit dem ich in mehreren txt-Files nach bestimmten Wörtern suchen kann.
Das skript soll eine die Suchbegriffe in einer Liste einlesen und dann alle txt-Files danach durchforsten und mir am ende fehlende Begriffe ausgeben.

Kann mir da jemand weiterhelfen? Oder hat jemand ne idee ob man das auch über ein anderes Programm lösen kann?
Die Liste der Suchbegriffe ist ziemlich lang. Deswegen fallen normale Find an Replace funktionen in txt-Editoren leider raus.

Gruß plunder
Private Nachricht senden Benutzer-Profile anzeigen


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 12.11.2013, 12:45     Titel:
  Antworten mit Zitat      
Es geht schon in MATLAB, z.B. mit TEXTREAD und dann Regular Expressions, aber wenn das nicht in technische Berechnungen eingebettet ist, also MATLAB das Beste Tool ist, ist vielleicht Perl besser...

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Plunder
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 14.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2013, 16:17     Titel:
  Antworten mit Zitat      
Danke für deine Antwort.

Bin leider nen ziemlicher Anfänger. Bräuchte also zumindest die groben Befehle, wie ich nach und nach jeden Suchbegriff durch alle txt-Files durchjagen kann.

Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 12.11.2013, 22:12     Titel:
  Antworten mit Zitat      
Also wenn es nur um einen Begriff geht.

http://www.gomatlab.de/platzhalter-t29954.html#119458

Dort hatte ich schon mal meine günstige "grep" Funktion gepostet.
Das sollte dir für den Anfang in jedem Fall ein Ansatz sein denke ich.
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 13.11.2013, 12:09     Titel:
  Antworten mit Zitat      
Hallo

schaue dir auch das Fileexhcange an, dort gibt sehr viele gute Lösungen:

http://www.mathworks.de/matlabcentr.....an-very-fast-grep-utility
Private Nachricht senden Benutzer-Profile anzeigen
 
Duall777
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 28.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.11.2013, 12:21     Titel:
  Antworten mit Zitat      
Also wenn ich alles richtig verstanden habe würde ich es so machen:
zunächst alle Begriffe nach denen du suchen willst in einer Matrix/Vektor speichern z.B. einem nx1 cell.


danach solltest du die dateipfade in denen sich deine .txt-dateien befinden ebenfalls in einer Matrix/Vektor speichern, dazu wäre es hilfreich wenn sie alle einem Ordner liegen.
der code für den pfad könnte so aussehen
Code:

Pfadname=uigetdir('','Ordner mit Dateien auswählen:');
 

Damit Öffnet sich ein Fenster mit dem Titel 'Ordner mit Dateien auswählen:' in dem du den ordner mit den Dateien auswählen kannst

Code:

Dateiname=dir(Pfadname);
 

damit speicherst du die namen (und noch andere infos über die dateien die für uns aber nicht wichtig sind) in einem struct namens Dateiname

Code:

n=1;
for i=1:length(Dateiname_alt)
   if strfind(Dateiname_alt(i).name , '.txt')>0
Dateipfad(n) = {strcat(Pfadname,'\',Dateiname(i).name)};
 

damit hast du den Dateipfad zu jeder datei in einem Vektor gespeichert
(zum verständnis die Variable "Pfadname" enthält nur dem Pfad zum ordner wo die dateien sich befinden nicht den Pfad zu den dateien selbst deshalb der obige code)

Mit dem Vektor Dateipfad und dem Vektor in dem deine Begriffe, nach denen du suchen willst, gespeichert sind (nennen wir ihn einfach mal "Begriffe") kannst du über eine for schleife den vergleich durchführen
das könnte so aussehen:
Code:

for v=1:length(Dateipfad)          %klappert jede Datei im Ordner ab        
   fid=fopen(Dateipfad(v),'r');    % öffnet die Datei an stelle v
   for vv=1:Length(Begriffe)      %klappert jeden begriff ab
       if strcmp(Begriffe(vv),fid)==0 & prüfft ob begriff in geöffneter Datei  
                                                   % auftaucht, wenn nicht
          treffer{vv,v}=Begriffe(vv);  % speichert den begriff in matrix
                                                    % treffer
       end;
   end;
   fclsoe(fid);      %schliesst die datei
                         % hiernach schleife beginnt von neuem und öffnet die
                         % die nächste datei
end;                
 


somit kriegst du am ende eine Matrix "treffer" in der in der 1. Spalte die fehlenden begriffe der ersten datei stehen in der 2. Spalte die fehlenden begriffe der 2. datei usw.

ich habe den code in Matlab nicht ausprobiert könnte sein das ich etwas übersehen habe besonders bei dieser schleife in schleife geschichte passiert das immer sehr schnell das man etwas nicht bedennkt also falls es nicht auf anhieb funktioniert dann sorry dafür aber mit etwas feinschliff sollte es dann gehen. also zumindest das prinzip sollte damit rübergekommen sein denke ich.

Hoffe ich konnte helfen
Private Nachricht senden Benutzer-Profile anzeigen
 
Duall777
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 28.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.11.2013, 13:46     Titel:
  Antworten mit Zitat      
hey mir is gerade ein fehler aufgefallen man kann diese zuweiseung

if strcmp(Begriffe(vv),fid)==0 & prüfft ob begriff in geöffneter Datei

leider nicht machen mann muss vorher die begriffe in eine Variable einlesen
heisst mann muss die schleife etwas umwandeln:

Code:

for v=1:length(Dateipfad)          %klappert jede Datei im Ordner ab        
   fid=fopen(Dateipfad(v),'r');    % öffnet die Datei an stelle v
   text=textscan(fid,'%s');      % speichert den Inhalt der Datei in "text"
   for vv=1:Length(Begriffe)      % klappert jeden begriff ab
       stl=strcmp(Begriffe(vv),text{1}) % speichert den Vergleichsvektor
                                                   % in stl. Stellen die mit 1 makiert sind
                                                   % dort gab es eine übereinstimmung
       if sum(stl)==0   % summiert stl auf, wenn es 0 ist taucht der Begriff
                                % in der .txt-Datei nicht auf, dann
         treffer{vv,v}=Begriffe(vv);  % speichert den begriff in matrix
                                                    % treffer
       end;
   clear stl;
   end;
   fclose(fid);      %schliesst die datei
                         % hiernach schleife beginnt von neuem und öffnet die
                         % die nächste datei
   clear text;
end;  
 

so müsste es gehen, dass problem ist das durch
fid=fopen(Dateipfad(v),'r');
die variable fid einen zahlenwert bekommt( bei mir war es 5, also fid=5)
und dadurch die if-bedingung
if strcmp(Begriffe(vv),fid)==0
immer erfüllt sein wird, da fid nicht den Inhalt der .txt-datei enthält. Das habe ich irgendwie verpeillt
Private Nachricht senden Benutzer-Profile anzeigen
 
Plunder
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 14.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.11.2013, 08:28     Titel:
  Antworten mit Zitat      
Also erstmal nen riesen Dankeschön für deine Hilfe!!

Allerdings klappt es bei mir nicht. Ich bekomme diesen Fehler:


Error using fopen
First input must be a file name of type char, or a file identifier of type
double.

Mir fällt ist auch noch aufgefallen, dass der Vector Dateiname die größe 1x46 hat, obwohl nur 42 txt dateien vohanden sind...
Die ersten Beiden einträge sind "." und ".."
"i" ist zu dem Zeitpunkt des Fehlers bei 3. Also bei der ersten Richtigen Datei.

Gruß Till
Private Nachricht senden Benutzer-Profile anzeigen
 
Plunder
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 14.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.11.2013, 08:42     Titel:
  Antworten mit Zitat      
Achso, noch eine Sache.

Mir fällt gerade auf, dass du mich nicht ganz verstanden hast. (Oder ich deinen Code nicht) Smile

Momentan öffnet er doch eine txt Datei und sucht darin nach allen Begriffen. Dann öffnet er die nächste. usw. Oder?

Richtig wäre es aber anders rum. Es geht mir nur darum, ob jeder Begriff min. einmal irgendwo auftaucht.

Also nach Begriff 1 in allen txt files suchen, dann Begriff 2 in allen txt files... usw.
Und dann entweder nen Counter oder ne Warnung bei 0 Treffern.

Gruß Till
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 14.11.2013, 08:53     Titel:
  Antworten mit Zitat      
Hö? Die Reihenfolge ist doch egal solange das Ergebnis stimmt. Außerdem ist es schneller wenn die Datei nur einmal geöffnet werden muss und nach allen Begriffen gesucht wird, statt die Datei für jeden Suchbegriff erneut zu öffnen.
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
Plunder
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 14.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.11.2013, 09:05     Titel:
  Antworten mit Zitat      
Ja im Grunde ist es egal. Nur muss das Ergebniss dann sinnvoll ausgegeben werden. Es bringt ja nichts, wenn ich nachher für jedes File einzeln ne Liste habe, dass von den 3000 Bgriffen nur 200 drin stehen.

Die txt Files enthalten immer nur einen kleinen Teil der 3000 Begriffe. Ich will am ende nur wissen ob jeder Begriff min 1 mal vorgekommt.
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 14.11.2013, 09:49     Titel:
  Antworten mit Zitat      
Plunder hat Folgendes geschrieben:
Ja im Grunde ist es egal. Nur muss das Ergebniss dann sinnvoll ausgegeben werden.



Hahaha ja, aber das liegt ja an dir Smile Du musst dir lediglich gedanken über die Datenstruktur machen. Z.B. sowas wie a.('datei1').('begriff1')=0 etc.
Drei Beispiele für deine Durchsuchungsfunktion hast du ja bereits bekommen. Du musst lediglich den Output nach belieben speichern/anpassen.
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
Duall777
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 28.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.11.2013, 23:13     Titel:
  Antworten mit Zitat      
Hey,

ja stimmt da ist ein kleiner fehler im quelltext. Also versuchs mal entweder mit:
Code:

fid=fopen(Dateipfad{v},'r');  
 

also mach geschweifte klammern draus oder entferne die geschweiften klammern bei der erstellung des Vektors Dateipfad also mache aus
Code:

Dateipfad(n) = {strcat(Pfadname,'\',Dateiname(i).name)};
 

das hier
Code:

Dateipfad(n) = strcat(Pfadname,'\',Dateiname(i).name);
 

dann müsste es auch gehen, ich würde dir empfehlen das 2. zu versuchen
das problem war das fopen einen char erwartet und er mit der ursprünglichen zuweisung also mit
Dateipfad(n) = {strcat(Pfadname,'\',Dateiname(i).name)};
Dateipfad als cell erstellt (durch die geschweiften klammern)
und wenn du dann
Dateipfad(v)
eingibst erhälst du nicht den inhalt des cell , der ja ein char ist, erst wenn du es mit geschweiften klammern machst.

zum 2. problem

also der quelltext müsste richtig sein, ich hab etwas ähnliches programmiert und auch diesen code verwendet und bei mir liefs. wie sehen den die anderen beiden "unerwünschten" einträge aus? also wenn du ein vektor von 1x46 hast unf nur 42 dateien müssten ja noch 2 weitere einträge da sein. gut wärs wenn du nen screenshoot oda so davon reinstellen könntest.
und wie sieht "Dateipfad" aus, hat er auch diese einträge?

ansonsten sollte Dateipfad auch diese einträge hab und sollten sie IMMER an denn ersten beiden stellen auftauchen, kannst du anstelle von
Code:

for v=1:length(Dateipfad)
 

Code:

for v=3:length(Dateipfad)
 

schreiben dann fängt er an stelle 3 an und überspringt somit die ersten beiden einträge.

zum 3. problem

ja da hab ich das wohl mir anders gedacht also wie markuman schon sagt ist ja ne ausgabe geschichte die du gestallten kannst wie du willst. im momment ist es so, das er eine datei öffnet und diese mit allen begriffen vergleicht. du kannst es auch andersrum machen und einen begriff nehmen und ihn mit jeder datei vergleichen ich glaube das ist ehr das was du suchst das könnte so aussehen
Code:


for v=1:length(Begriffe)          %klappert jeden Begriff ab
  for vv=1:Length(Dateipfad)      % klappert jede Datei im Ordner ab      
   fid=fopen(Dateipfad(vv),'r');    % öffnet die Datei an stelle vv
   text=textscan(fid,'%s');      % speichert den Inhalt der Datei in "text"
       stl=strcmp(Begriffe(v),text{1}) % speichert den Vergleichsvektor
                                                   % in stl. Stellen die mit 1 makiert sind
                                                   % dort gab es eine übereinstimmung
       if sum(stl)==0   % summiert stl auf, wenn es 0 ist taucht der Begriff
                                % in der .txt-Datei nicht auf, dann
         treffer(v)=Begriffe(v);  % speichert den begriff in matrix treffer
       end;
    fclose(fid);      %schliesst die datei
    clear text;
    clear stl;
  end;
end;
 

am ende kriegst du dann einen Vektor "treffer" in dem dann die Begriffe stehen die in keiner .txt-datei vorkammen
probiers mal aus

MfG

Duall777
Private Nachricht senden Benutzer-Profile anzeigen
 
Duall777
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 28.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2013, 09:53     Titel:
  Antworten mit Zitat      
hey ich hab mir noch mal das mit Dateiname und den ".", ".." datein angeschaut. also warum diese einträge kommen weis ich nicht aber das ist für dich kein problem, weil durch die zeile
Code:

if strfind(Dateiname_alt(i).name , '.txt')>0
 

werden in Dateipfad nur die dateien übernehmen in deren Name '.txt' auftaucht. da es bei den beiden anderen nicht der Fall ist werden die nicht übernommen und du arbeitest ja mit dem Vektor Dateipfad weiter und nicht mit Dateiname von daher ist egal

MfG
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 - 2025 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.