Definitionsdatei zum Suchen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
DrNo
Beiträge: 202
Registriert: 09.05.2008 15:20
Wohnort: BW, Deutschland
Kontaktdaten:

Definitionsdatei zum Suchen

Beitrag von DrNo »

Hallo,
Also ich hab hier ein Suchprogramm dass nach bestimmen Datei(namen) sucht. Nun wirds im Code allerdings langsam unübersichtlich wenn ich mehr als 10 Ors' drin hab.

Wie würdet ihr das am besten machen?

Also dass die gesuchten Wörter in einer Datei drin sind, mit ner einfachen Textdatei, oder soner pb prefs datei?
Halt möglichst einfach...

DrNo
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

Win11 x64 | PB 6.20
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Ein paar Infos wären schon schön, so weiß niemand was Du wirklich machen
möchtest.
Wenns fixe strings sind:

Code: Alles auswählen

DataSection
  Suchdefinition:
  Data.s "blub.txt", "blubber.html"
EndDataSection
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Nun wirds im Code allerdings langsam unübersichtlich wenn ich mehr als 10 Ors' drin hab.

ja doll, eine Sehr genaue Beschreibung... /:->

ich interpretier das mal so, dass du in einem IF mit allen Suchbegriffen vergleichst....

also
wenn du eine Stammliste mit einer Suchliste vergleichen willst,
dann benutzt du sinnvoller Weise zwei geschachtelte Schleifen.
die Äußere geht die Stammliste durch, die Innere die Suchliste.
bei Erfolg setzt du ein Gefunden-Flag,
das als zusätzliche Ausstiegsbedingung für die beiden Schleifen fungiert,
oder fügst die Fundstelle einer Fundliste hinzu,
wenn du mehrere Ergebnisse haben willst.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
DrNo
Beiträge: 202
Registriert: 09.05.2008 15:20
Wohnort: BW, Deutschland
Kontaktdaten:

Beitrag von DrNo »

Also...ums genau zu sagen :)

Ich streame öfters Radio und dabei wird die zwischenwerbung auch immer mitgestreamt. Nun hat die Werbung aber immer gleiche namen, hinundwieder kommen neue dazu. Nun lasse ich den/die Ordner durchsuchen und alle Namen, die zutreffen, löschen.

Nix besonderes bisjetzt, mir gehts aber ums Prinzip:

Code: Alles auswählen

Procedure Scan(Pfad$)
  EDID = ExamineDirectory(#PB_Any,Pfad$,"*.*")
  If EDID
    While NextDirectoryEntry(EDID)
      Entryname$ = DirectoryEntryName(EDID)
      If DirectoryEntryType(EDID) = #PB_DirectoryEntry_Directory And Not Entryname$ = "." And Not Entryname$ = ".."
        Scan(Pfad$+"\"+Entryname$)
      ElseIf DirectoryEntryType(EDID) = #PB_DirectoryEntry_File And Not Entryname$ = "." And Not Entryname$ = ".."
        If Entryname$="LOT OF GAS.mp3" Or Entryname$="SERVING THE UNIVERSE.mp3" Or Entryname$=".977 Sweeper - We Play It.mp3" Or Entryname$="GOOD THINGS.mp3" Or Entryname$="WE HAVE JOBS.mp3" Or Entryname$="977Sweeper104.mp3" Or Entryname$="233902.mp3" Or Entryname$="Escape The Noise.mp3" Or Entryname$="GREAT SPONSORS - PROMO.mp3" Or Entryname$="977Sweeper100.mp3" Or Entryname$="207643.mp3" Or Entryname$="GOOD RADIO.mp3" Or Entryname$="THE EIGHTIES CHANNEL - VOICE ONLY.mp3"
          AddGadgetItem(0, -1, Entryname$)
          DeleteFile(Pfad$+Entryname$)
        EndIf
      EndIf
    Wend
    FinishDirectory(EDID)
  EndIf 
EndProcedure
Pfad$ = PathRequester("Verzeichnis angeben...", "C:\")

OpenWindow(0, 0, 0, 500, 260, "977 AdKiller 80s Channel Edition - März 2009", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(0, 10, 10, 480, 240) 
Scan(Pfad$)

Repeat
   Event = WaitWindowEvent()
   
Until Event = #PB_Event_CloseWindow
Da wo die vielen Ors sind, da sind die Namen der Werbung. Und die will ich in eine Datei bringen. Also der Scanner liest jeden Namen einer Datei ein und vergleicht sie mit einer Liste. Stimmt einer überein wird er gelöscht.

DrNo
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ahyo.... das meinte ich mit "Vergleichsliste".

die Namen kannst du in eine Textdatei packen, und mit ReadString einlesen,
oder wenn du ständig neu kompilieren willst, auch in Data-Zeilen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
DrNo
Beiträge: 202
Registriert: 09.05.2008 15:20
Wohnort: BW, Deutschland
Kontaktdaten:

Beitrag von DrNo »

Sorry, aber bin etwas außer ... wie nennt man das? :roll:
Naja jedenfalls hab ich shcon länger nix mer gescriptet. Jedenfalls könntest du mir vllt. ein kleines Beispiel machen?

Also auf Basis des Codes oben. Er hat eine Datei, nimmt ihren namen...und dann? Mit Readstring jeden einzelnen Namen der Datei durchgehen obs trifft...!?

DrNo
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Code: Alles auswählen

DataSection
  startselection:
  Data.s "bla.txt", "blubber.wav", "blub.txt"
  Data.s ""
EndDataSection

NewList blub.s()
Restore startselection
Repeat
  Read.s tmp.s
  If tmp
    AddElement(blub())
    blub() = tmp
  Else
    Break
  EndIf
ForEver

Directory$ = "C:\"   ; Listet alle Einträge auf C:\ auf (ohne die Inhalte aus Unterverzeichnissen)
If ExamineDirectory(0, Directory$, "*.*")
  While NextDirectoryEntry(0)
    If DirectoryEntryType(0) = #PB_DirectoryEntry_File
      File.s = DirectoryEntryName(0)
      ForEach blub()
        If blub() = GetFilePart(File)
          Debug "Found" : Break
        EndIf
      Next
    EndIf
  Wend
  FinishDirectory(0)
EndIf
Wie Du den Text nun in die Linklist packst, sollte ja wurscht sein.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
DrNo
Beiträge: 202
Registriert: 09.05.2008 15:20
Wohnort: BW, Deutschland
Kontaktdaten:

Beitrag von DrNo »

Ok Danke,
Also Wenn ich dich/den Code richtig verstanden habe einfach die ganzen Namen vor dem Scan in eine Linklist packen und dann halt vergleichen. Gut dann probiers ichs mal mit ner ext. Datei.

DrNo
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

hier mal mit datei..... :mrgreen:

diese Liste als "NameList.txt" speichern:

Code: Alles auswählen

LOT OF GAS.mp3
SERVING THE UNIVERSE.mp3
.977 Sweeper - We Play It.mp3
GOOD THINGS.mp3
WE HAVE JOBS.mp3
977Sweeper104.mp3
233902.mp3
Escape The Noise.mp3
GREAT SPONSORS - PROMO.mp3
977Sweeper100.mp3
207643.mp3
GOOD RADIO.mp3
THE EIGHTIES CHANNEL - VOICE ONLY.mp3
hier der Code:

Code: Alles auswählen

If ReadFile(0, "NameList.txt")
    NewList SearchList.s()
    While Not Eof(0)
      AddElement(SearchList())
      SearchList() = ReadString(0)
    Wend
  CloseFile(0)
Else
  MessageRequester("ERROR","Comparelist File not found")
  End
EndIf

NewList Stammliste.s()

;************************************************
;**
;** Stammliste erzeugen
;**
;** das wird später die Directory-Entry-Liste
;**
ResetList(SearchList())
For n=0 To 199
  Laenge = 10 + Random(10)
  If Laenge = 10
    If Not NextElement( SearchList() )
      ResetList( SearchList() )
      NextElement( SearchList() )
    EndIf
    dummy$ = SearchList()
  Else
    dummy$ = ""
    For t=1 To Laenge
      dummy$ + Chr( 32 + Random(95) )
    Next
  EndIf
  AddElement( Stammliste() )
  Stammliste() = dummy$
Next
;************************************************


;************************************************
;**
;** Stammliste durchsuchen
;**
;************************************************

counter = 0
ForEach Stammliste()
  counter +1
  Debug "Prüfe Satz "+Str(counter)+" ...."
  Debug "Inhalt: " + Stammliste()
;*********************************
  Found = 0
  SearchCount = 0
  ForEach SearchList()
    SearchCount +1
    If Stammliste() = SearchList()
      Found = 1
      Break
    EndIf
  Next
;*********************************
  If Found
    Debug "Element gefunden: Suchbegriff Nummer " + Str( SearchCount )
  Else
    Debug "Keine Übereinstimmung"
  EndIf
  Debug "----------------------------------------------"
Next
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten