Brauche Unterstützung

  • #1
G

Gandalf_the_Grey

Bekanntes Mitglied
Themenersteller
Dabei seit
19.11.2003
Beiträge
2.768
Reaktionspunkte
0
Ort
Großraum Frankfurt/Main
Hallo zusammen,

ich habe ein kleines Problem wo ich eure Unterstützung brauche. Ich brauche ein kleines Script Tool was mir bei folgender Aufgabe behilflich ist. Ich habe ein Verzeichniss in dem sich etwa 6000 Dateien befinden. Die Dateien haben alle eins gemeinsam, denn EIGENTLICH gehören immer 4 Dateien zu einem 4er Packet zusammen. Diese Dateien unterscheiden sich im Dateinamen nur an der ersten Stelle. (ein kleines Beispiel)

I0123456.789
P0123456.789
T0123456.789
F0123456.789

Mein Problem ist das nicht alle Dateien zu einem kompletten 4er Packet gehören. D.h. das bei einigen Packeten z.B. die Datei mit dem Anfang I Fehlen usw.

Nun möchte ich irgendwie automatisiert diejenigen Datein aussortieren die ENTWEDER a) ein komplettes 4er Packet ergeben oder b) KEIN komplettes 4er Packet ergeben. Jedenfalls sollen die Kompletten 4er Packete von den unvollständigen getrennt werden. Ich weiß allerdings zur Zeit nicht wie ich es angehen soll bzw. wie eine mögliche Lösung aussehen könnte. Hat jemand eine Ahnung was man da machen kann?!
 
  • #2
Hm, also ich würde das so spontan einfach so machen, dass ich mir den ersten Dateinamen hernehme und ihn so formatiere, dass ich die entsprechenden zugehörigen Dateien finden kann, sprich den ersten Buchstaben entfernen (und sonstige Formatierungen, sollte es mehr unterschiede geben)
Dann suchst du einfach nach der ersten zugehörigen Datei, indem du z.B. das P vorne vorstellst. Wird die Datei gefunden, packst du den Dateinamen in einen Array, in dem der erste Dateiname auch schon steht.
Dann lässt du nach der nächsten Datei suchen, indem du das f vorne vorstellst und speicherst sie auch in dem Array. Das machst du mit allen Dateivariationen.
Am Ende hast du also einen Array, der die Dateinnamen beinhaltet, die zueinandergehörig sind. Entsprechend, ob nun 2, 3 oder gar alle 4 Dateien in dem Array enthalten sind. Sind es vier, dann kopierst du sie einfach in ein anderes Verzeichnis. Die Funktion lässt du dann rekursiv durchlaufen.
Das einzige was du dann beachten müsstest ist, dass du einen weiteren Array brauchst, der bereits gescannte Dateinamen beinhaltet, da du sonst immer dieselbe Dateivariationen suchst.
Ich hoffe ich habe dich richtig verstanden und mich verständlich ausgedrückt.
 
  • #3
Ja, auf die Idee bin ich auch gekommen, allerdings lande ich da immer wieder bei PHP als Skriptsprache, aber ich wollte deswegen nicht extra nen lokalen Webserver einrichten, bzw. PHP installieren (geht ja auch ohne Apache). Dachte vieleicht hat jemand ne Idee ob und wie das mit einer Batch gehen könnte.
 
  • #4
Oh, danach hatte ich gar nicht gedacht. Ich bin einfach davon ausgegangen, dass du an ein PHP Problem denkst, weil deine zwei, drei Probleme, die du sonst hast, auch PHP bezogen sind ;)

Öh, aber so was kann man ja auch in jeder anderen Sprache machen. Nur da bist du bei mir im Moment an der falschen Adresse :(
 
  • #5
Hi

Das hört sich nach Perl bedürftigen an ;D

Gruß, Michael
 
  • #6
Hmm, wie auch immer, ich weiß jedenfalls nicht wie ich das Problem außerhalb von PHP lösen kann. PHP will ich wie gesagt nicht nutzen weil ich wegen dieser Aufgabe nicht extra PHP einsetzen will. Wenn jemand ne Alternative Lösung hat wäre das sehr genial.
 
  • #7
Hi

Mit php_cli.exe ist es glaube funtkionert PHP auch auf der Kommandozeile.

Gruß, Michael
 
  • #8
*lach* das PHP auch ohne Apache läuft weiß ich, aber dazu muss ich PHP trotzdem installieren. Würde aber gerne ohne sowas auskommen, aber wie es scheint muss ich doch zu einer PHP Lösung greifen. Danke trotzdem an alle.
 
  • #9
Na ja, oder wartest noch bis hier jemand vorbeikommt, der Lust, Zeit und das benötigte Können parat stellt und dir eben das entsprechende Programm schreibt. Aber ich denke das hilft nicht weiter, oder? :-\
 
  • #10
Cledith schrieb:
Na ja, oder wartest noch bis hier jemand vorbeikommt, der Lust, Zeit und das benötigte Können parat stellt und dir eben das entsprechende Programm schreibt. Aber ich denke das hilft nicht weiter, oder? :-\

Nee, denn a) habe ich bis dahin die Aufgabe von Hand erledigt b) ist das nicht der Sinn der Übung (ich dachte das das vieleicht auch per Batch möglich sei und hoffte das ich hier vieleicht nen Denkanstoß bekommen würde) und c) weiß ich dann ja auch nicht was getan wird und d) habe ich nichts dabei gelernt.
 
  • #11
Hi Gandalf_the_Grey,

man könnte das per Excel /Makro lösen:
- die Datei-Namen einlesen,
- in eine Spalte eines Excelsheets schreiben,
- zum Sortieren eine zweite Spalte mit den Dateinamen ohne den Anfangsbuchstaben erzeugen
- nach der zweiten Spalte sortieren
- dann die zweiten Spalte auswerten
(vier gleiche untereinander (positive) ,
ungleich vier gleiche untereinander (negativ)
- entsprechend der Auswertung die Dateien in entsprechende Verzeichnisse kopieren

Ist nur die Frage, ob Du an diese Laufwerke mit Excel herankommst, oder ob das Kopieren über ein Batchfile erfolgen muß. Dieses müßte der Makro dann statt dem Kopieren generieren.

Gruß Matjes :)
 
  • #12
Hi Gandalf_the_Grey,

hab dir einen Excel-Makro geschrieben, der die Dateinamen in einem Quellverzeichnis ausliest und dann überprüft, ob unter diesen Dateinamen Quadrupel sind, die sich nur im ersten Zeichen unterscheiden. Diese kopiert der Makro in das Positiv-Verzeichnis, alle anderen in das Negativ-Verzeichnis.

Die Konstanten bzgl. der Verzeichnisse mußt Du noch anpassen (c_Quellpfad, c_Zielpfad_pos, c_Zielpfad_neg ).

Wenn Du noch Fragen hast, melde dich.

Gruß Matjes :)

Code:
Option Explicit

Const c_Quellpfad = c:\download\01_Dateiverzeichnis
Const c_Zielpfad_pos = c:\download\02_Dateiverzeichnis_positiv
Const c_Zielpfad_neg = c:\download\03_Dateiverzeichnis_negativ

Type f_DateiAngabePfad_type
  Datei As String
  Pfad As String
  Pfad_Datei As String
End Type
Type f_Datei_type
  start As Long
  cnt As Long
  f() As f_DateiAngabePfad_type
End Type
Public f_feld(1 To 1) As f_Datei_type

'**********************************************************************************
Sub DateienTrennen()
 ->liest alle Datei-Namen des Quellverzeichnisses ein
 ->prüft, ob sich darunter Quadrupel von Dateinamen befinden,
 ->die sich nur durch das erste Zeichen unterscheiden
 ->wenn ja: -> werden diese Dateien in das Positiv-Verzeichnis kopiert
 ->der Rest wird in das Negativ-Verzechnis kopiert
'**********************************************************************************
  Dim ws As Worksheet, i As Long, l_rows As Long, l_cols As Long
 ->files aus Quellverzeichnis lesen
  If 0 < FileVerz_Anlegen(c_Quellpfad, *.*, f_feld) Then
   ->neues Blatt anlegen
    Set ws = ActiveWorkbook.Worksheets.Add
   ->Spalte 1 + 2 als Text formatieren
    ws.Columns(1).NumberFormat = @
    ws.Columns(2).NumberFormat = @
    For i = f_feld(1).start To f_feld(1).cnt
      ws.Cells(i, 1).Value = f_feld(1).f(i).Datei
      ws.Cells(i, 2).Value = _
        Right(ws.Cells(i, 1).Value, Len(ws.Cells(i, 1).Value) - 1)
    Next
   ->nach Spalte 2 sortieren
    l_rows = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    l_cols = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
   ->Daten nach Spalte 2 sortieren
    ws.Range(ws.Cells(1, 1), ws.Cells(l_rows, l_cols)).Sort _
    Key1:=ws.Range(ws.Cells(1, 2), ws.Cells(1, 2)), Order1:=xlAscending, _
    Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

   ->für jedes file
    For i = 1 To l_rows
      If (ws.Cells(i, 2).Value = ws.Cells(i + 1, 2).Value) And _
        (ws.Cells(i, 2).Value = ws.Cells(i + 2, 2).Value) And _
        (ws.Cells(i, 2).Value = ws.Cells(i + 3, 2).Value) Then
       ->positiv -> alle 4 kopieren
        FileCopy c_Quellpfad & \ & ws.Cells(i, 1).Value, _
                 c_Zielpfad_pos & \ & ws.Cells(i, 1).Value
        FileCopy c_Quellpfad & \ & ws.Cells(i + 1, 1).Value, _
                 c_Zielpfad_pos & \ & ws.Cells(i + 1, 1).Value
        FileCopy c_Quellpfad & \ & ws.Cells(i + 2, 1).Value, _
                 c_Zielpfad_pos & \ & ws.Cells(i + 2, 1).Value
        FileCopy c_Quellpfad & \ & ws.Cells(i + 3, 1).Value, _
                 c_Zielpfad_pos & \ & ws.Cells(i + 3, 1).Value
        i = i + 3
      Else
       ->negativ -> einzelnes file kopieren
        FileCopy c_Quellpfad & \ & ws.Cells(i, 1).Value, _
                 c_Zielpfad_neg & \ & ws.Cells(i, 1).Value
      End If
    Next
   ->Blatt wieder löschen
    Application.DisplayAlerts = False: ws.Delete: Application.DisplayAlerts = True
    Set ws = Nothing
  End If
End Sub
'**********************************************************************************
Public Function FileVerz_Anlegen(ByRef sSuchpfad As String, ByRef sExtension As String, _
                          ByRef fx() As f_Datei_type) As Integer
'**********************************************************************************
'FilesVerzeichnis eines Directories erstellen
Dim fs As FileSearch, i As Long, ret As Integer

 ->Rueckgabewert Anzahl files initialisieren
  FileVerz_Anlegen = 0
 ->Verz initialisieren
  fx(1).cnt = 0: fx(1).start = 1

 ->Verz erstellen
  Set fs = Application.FileSearch
  fs.NewSearch: fs.LookIn = sSuchpfad: fs.FileName = sExtension
  i = fs.Execute(SortBy:=msoSortByFileName, SortOrder:=msoSortOrderAscending)
  If fs.FoundFiles.Count > 0 Then
    For i = 1 To fs.FoundFiles.Count
      fx(1).cnt = fx(1).cnt + 1
      ReDim Preserve fx(1).f(fx(1).start To fx(1).cnt)
      fx(1).f(fx(1).cnt).Pfad_Datei = fs.FoundFiles(i)
      fx(1).f(fx(1).cnt).Pfad = sSuchpfad
      fx(1).f(fx(1).cnt).Datei = NurFilenamen(fs.FoundFiles(i))
      FileVerz_Anlegen = FileVerz_Anlegen + 1
    Next i
  Else
    MsgBox No file found:  & sSuchpfad & \ & sExtension
  End If
  Set fs = Nothing
End Function
'**********************************************************************************
Private Function NurFilenamen(s_vollstaendigerFilename As String) As String
'**********************************************************************************
'schneidet die Pfadangaben aus einem String und gibt den Filenamen zurueck
Dim p1 As Integer, p2 As Integer

  p2 = 0: p1 = 0
  Do
    p1 = InStr(p1 + 1, s_vollstaendigerFilename, \): If p1 <> 0 Then p2 = p1
  Loop While p1 <> 0
  NurFilenamen = Right(s_vollstaendigerFilename, Len(s_vollstaendigerFilename) - p2)
End Function
 
  • #13
*grosseaugenkrieg* Boah DANKE :D *freu*. An Excel bzw. Makro's habe ich ja mal überhaupt nicht gedacht. Das ist echt ideal. Denn Excel ist auf dem betreffenden Rechner eh drauf (Standartsoftware) und so kann ich mir auch gleich mal Makro's näher anschauen. Erstmal VIIIIEEEELLLEEENN Dank Matjes. Ich probier es gleich nachher mal aus!
 
  • #14
Hi Matjes,

also ich habe das Makro in eine neue Arbeitsmappe eingefügt und habe ausschließlich die Pfadangaben geändert (e:\daten2003; e:\positiv; e:\negativ) Aber er sagt mir beim ausführen des Makros No file found: e:\daten2003\*.* Woran kann das liegen? Ich habe auch schon mit anderen Verzeichnissennamen probiert. Habe Großschreibung beim Laufwerksbuchstaben probiert, hilft aber alles nix.
 
  • #15
Hi Gandalf_the_Grey,

da muß etwas mit den Pfadangaben nicht ganz stimmen.
Hab den Makro in einer anderen Umgebung noch einmal ausprobiert -geht :D

Poste doch die ersten 10 Zeilen des Makros nach deiner Änderung.
(Excel-Datei mit Makro öffnen, dann Alt+F11)

Gruß Matjes :)
 
  • #16
Bitteschön :)

Code:
Option Explicit

Const c_Quellpfad = e:\daten2003
Const c_Zielpfad_pos = e:\positiv
Const c_Zielpfad_neg = e:\negativ

Type f_DateiAngabePfad_type
  Datei As String
  Pfad As String
  Pfad_Datei As String
 
  • #17
Was ist denn mit den Rechten des Users auf diesen Dateien?

Wenn Du in Excel auf Datei öffnen gehst,das Verzeichnis e:\daten2003 wählst, den Dateifilter auf *.* (Alle Dateien) stellst, hast Du dann ein paar Dateien zur Auswahl ?

Gruß Matjes :)
 
  • #18
Jupp, alle Daten so wie gewünscht.
 
  • #19
Versuch es mal mit folgender Änderung:
den Dateifilter *.* gegen *;*.* ersetzen.
die Zeile:
Code:
  If 0 < FileVerz_Anlegen(c_Quellpfad, *.*, f_feld) Then
ändern in:
Code:
  If 0 < FileVerz_Anlegen(c_Quellpfad, *;*.*, f_feld) Then

Gruß Matjes :)
 
  • #20
Also jetzt lautet die Fehlermeldung: No file found: e:\daten2003\*;*.*
 
Thema:

Brauche Unterstützung

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.839
Beiträge
707.962
Mitglieder
51.491
Neuestes Mitglied
haraldmuc
Oben