PDA

Vollständige Version anzeigen : Dateien in richtigen Ordner schieben


Jack_Plumpi
28.03.2008, 10:57
Hallo zusammen,

ich habe ein "Filesystem" für Airlines und weitere Bereiche.

Zusammen sind das ganze 289 Ordner!!!

Wenn ich jetzt neue Files erhalte, benenne ich die nach einem von mir vorgebenen System um. Bei den Airlines ist das zB "Airlinename Kürzel Prefix".
Diese Reihenfolge ist immer diesselbe, dh die ersten Teile der Dateien haben immer das gleiche Aussehen. Der Airlinename kann aber natürlich aus mehreren Wörtern bestehen - zB "Lufthansa Cargo LH 020".

Gibt es jetzt eine Möglichkeit diese Files von einem Ordner "Erledigt" aus automatisch einsortieren zu lassen??? Ich habe schon etwas gestöbert und ich schätze mit DOS-bat-Datei ist da nix zu machen bzw. zu umständlich.
Ein Select Case in VBA mit 289 Cases ist wahrscheinlich auch nicht das wahre - oder doch???

Das ganze soll unter Windows XP bzw Office 2003 laufen.

Bitte um Eure Hilfe - danke!

Joachim Hofmann
28.03.2008, 17:10
Frage:
Das Umbennen funktioniert aber schon oder noch nicht?

Ansonsten:
Mach es bitte etwas konkreter an einem Beispiel für ein File, einen Ordner etc. damit das Problem klarer wird. Was soll nach welchem System wohin einsortiert werden?

Jack_Plumpi
31.03.2008, 20:07
Hallo Joachim,

Das Umbenennen mache ich NICHT automatisch.
Da gehe ich immer auf den richtigen Ordner und kopiere den Namen für das File dann heraus, weil ich ja vorher nicht immer genau weiß was das für ein File ist.

Also zB ein Ordner "Lufthansa Cargo LH 020" und darunter Files wie
"Lufthansa Cargo LH 020 Information März 2008.pdf".

Ein anderer Ordner ist zB "Alitalia AZ 055" mit einem File "Alitalia AZ 055 Daten 022008.xls"

Die Files sind zuerst alle im Ordner "D:\Datenbank\erledigt".
Jetzt soll ein automatischer Prozess diese Dateien automatisch in den richtigen Ordner einsortieren. Die Lufthansa-Files alle in den Ordner Lufthansa usw.

Die Struktur ist immer so:
D:\Datenbank\Files\Airlines\A-C\Alitalia AZ 055\ oder
D:\Datenbank\Files\Airlines\D-J\Lufthansa Cargo LH 020\ usw.

Hoffe das reicht :p

Joachim Hofmann
03.04.2008, 15:38
Sind diese Dateien immer 5teilig, wobei die ersten 3 Teile den Namen des neuen Ordners darstellt?

Jack_Plumpi
07.04.2008, 12:05
Wenn du das zB auf "Alitalia AZ 055 Daten 022008.xls" beziehst - dann ja.
Aber wie erwähnt kann es auch sein, dass der Name auch mehr als 2 Einträge hat.
zB "Lufthansa Cargo LH 020 Information März 2008.pdf" oder "Air New Zealand NZ 086 Information März 2008.pdf".

Der unterstrichene Teil stellt aber immer den richtigen Ordner dar, lediglich die Einteilung von "A-C", etc. steht noch davor...

Wenns hilft:
Die Ordnerprefixes (A-C, D-J, ...) & die Airlineordner (Alitalia AZ 055, Air New Zealand NZ 086) sind auch in meiner DB abgespeichert!
Wenn du also was mit VBA machen willst, dann wären die Daten vorhanden.
Die diesbezüglichen Spalten heissen bei mir "File_Folder_Prefix" (A-C, ..) & "File_Folder". Ausser einem Select Case mit über 200 Cases fällt mir nämlich hier nicht viel ein...

Bin schon gespannt...

Joachim Hofmann
07.04.2008, 15:17
Hallo Plumpi,

wenn die Dateinamen regelmäßig strukturiert wären, wäre es ein Einzeiler in einer .bat-Datei,
Z.B. wie gesagt 3 erste Teile wären Airlinename, aus denen wird dann automatisch ein Verzeichnis erstellt und die Datei kopiert.
Aber so unstrukturiert (sogar der übrigen Teile, die nicht die Airline darstellen, sind das ja) ist da ohne komplizierte eigene Programmierung wohl nichts zu machen.

IngGi
09.04.2008, 00:59
Hallo zusammen,

so ganz unstrukturiert scheinen mir die Dateinamen gar nicht zu sein. Wenn ich richtig liege, ist der letzte Teil des Dateinamens, der noch zum Ordnernamen gehört, immer der erste rein numerische Teil des Dateinamens. Falls das gesichert zutrifft, würde folgendes VBScript die Dateien in die richtigen Ordner einsortieren:
<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Option</span> <span class="TOKEN">Explicit</span>
&nbsp;
<span class="TOKEN">Dim</span> objFSO
<span class="TOKEN">Dim</span> objFoSource
<span class="TOKEN">Dim</span> objFile
<span class="TOKEN">Dim</span> arrNameParts
<span class="TOKEN">Dim</span> intSeparate
<span class="TOKEN">Dim</span> intMount
<span class="TOKEN">Dim</span> intTest
<span class="TOKEN">Dim</span> strLetters
<span class="TOKEN">Dim</span> strFoName
&nbsp;
<span class="TOKEN">Set</span> objFSO = WScript.CreateObject(&quot;Scripting.FileSystemObject&quot;)
<span class="TOKEN">Set</span> objFoSource = objFSO.GetFolder(&quot;D:\Datenbank\erledigt&quot;)
&nbsp;
<span class="TOKEN">For</span> <span class="TOKEN">Each</span> objFile <span class="TOKEN">In</span> objFoSource.Files
arrNameParts = Split(objFile.Name, &quot; &quot;)
<span class="TOKEN">If</span> Asc(LCase(Left(objFile.Name, 1))) &lt; 100 <span class="TOKEN">Then</span>
strLetters = &quot;A-C&quot;
<span class="TOKEN">ElseIf</span> Asc(LCase(Left(objFile.Name, 1))) &lt; 107 <span class="TOKEN">Then</span>
strLetters = &quot;D-J&quot;
<span class="TOKEN">ElseIf</span> Asc(LCase(Left(objFile.Name, 1))) &lt; 115 <span class="TOKEN">Then</span>
strLetters = &quot;K-R&quot;
<span class="TOKEN">Else</span>
strLetters = &quot;S-Z&quot;
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">For</span> intSeparate = 0 <span class="TOKEN">To</span> <span class="TOKEN">UBound</span>(arrNameParts) - 1
<span class="TOKEN">On</span> <span class="TOKEN">Error</span> <span class="TOKEN">Resume</span> <span class="TOKEN">Next</span>
intTest = <span class="TOKEN">CInt</span>(arrNameParts(intSeparate))
<span class="TOKEN">On Error GoTo 0</span>
<span class="TOKEN">If</span> intTest &gt; 0 <span class="TOKEN">Then</span> <span class="TOKEN">Exit For</span>
<span class="TOKEN">Next</span> <span class="REM">'intSeparate</span>
<span class="TOKEN">For</span> intMount = 0 <span class="TOKEN">To</span> intSeparate
strFoName = strFoName &amp; arrNameParts(intMount) &amp; &quot; &quot;
<span class="TOKEN">Next</span> <span class="REM">'intMount</span>
strFoName = Left(strFoName, Len(strFoName) - 1)
objFSO.MoveFile objFile.Path, &quot;D:\Datenbank\Files\Airlines\&quot; _
&amp; strLetters &amp; &quot;\&quot; &amp; strFoName &amp; &quot;\&quot; &amp; objFile.Name
strFoName = &quot;&quot;
intTest = 0
<span class="TOKEN">Next</span> <span class="REM">'objFoSource</span>
&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Gruß Ingolf

Jack_Plumpi
16.04.2008, 19:53
Hallo Ingolf,

Ich habe jetzt mal mit Files probiert, wo das ganze zutrifft - es geht wunderbar. :)

FÜR ALLE SUCHENDEN - Ein Zitat einer Website:
Da die FileSystemObjects nicht integraler Bestandteil von Visual Basic sind, müssen Sie diese erst aktivieren. Hierzu öffnen Sie den Dialog Projekt - Verweise und aktivieren dort den Eintrag Microsoft Scripting Runtime


Danke für den Code - kleines Problem:
Es kann auch bereits im Kürzel eine Zahl stehen und nicht erst im Prefix!

Also zB:
Air New Zealand NZ 086 - konform
Air Blabla 2J 226 - nicht konform

Was könnte man da machen?

Wenn es nicht möglich ist, dann soll im Code diese Datei übersprungen werden, damit der Rest aber durchläuft!


Erweiterung:
Ich habe noch eine andere "Type" von Files und zwar jene Files die zu Beginn das Wort "WICHTIG" haben.
Beispiele: "WICHTIG Alpha Beta .....", "WICHTIG Master ......"

Analog dazu gibt es im Ordner Files neben "D:\Datenbank\Files\Airlines" auch "D:\Datenbank\Files\WICHTIG" für diese Files.
Natürlich sind im Ordner "WICHTIG" die Unterordner "Alpha Beta" und "Master" zu finden.
Das schöne hier: Diese Ordner sind alle ohne Zahlen - also reiner Text!

Kann man dies in dem Code integrieren oder muß da was eigenes gestrickt werden?

Hatte noch null Ahnung von diesen FSO-Sachen - das ist aber echt praktisch...

Danke & lg

IngGi
18.04.2008, 14:25
Hallo Jack_Plumpi,

zu dem Problem mit der Zahl im Airlinekürzel wäre zu sagen, dass das nur dann zu einem Fehler führt, wenn das gesamte Kürzel ausschließlich aus Ziffern besteht. Eine Kombination aus Ziffern und Buchstaben ist dagegen unschädlich. Infolge der gewünschten Erweiterung hat sich dieses Problem alledings sowieso erübrigt, da ich dafür noch einmal einen etwas anderen Lösungsansatz gewählt habe, den ich nun für alle Dateien verwende. Eine Prüfung auf numerische Namensteile erübrigt sich hierbei.

Du schreibst
Das schöne hier: Diese Ordner sind alle ohne Zahlen - also reiner Text!



Dem möchte ich widersprechen. Denn gerade durch den numerischen Namensteil war es ja bisher überhaupt erst möglich, den Teil des Dateinamens herauszufinden, der den Ordnernamen ergibt. Das ist mit der gewünschten Erweiterung nun so nicht mehr möglich. Im nachfolgenden Makro gehe ich daher so vor, dass ich zunächst nur den ersten Teil des Dateinamens nehme und prüfe, ob ein Ordner existiert, dessen Name nur aus diesem ersten Teil des Dateinamens besteht. Wenn nicht, nehme ich den zweiten Teil des Dateinamens hinzu und prüfe erneut. Das geht solange, bis entweder ein existierender Ordner gefunden wird - in diesen wird die Datei dann verschoben - oder bis der gesamte Dateiname geprüft, aber kein entsprechender Ordner gefunden wird. In diesem Fall bleibt die Datei im Ordner "erledigt" stehen.

Da ich den erforderlichen "Versuchsaufbau" nicht nochmal nachbauen wollte, ist das Makro diesesmal ungetestet, mit der Bitte um Rückmeldung, falls noch Fehler auftauchen sollten:
<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Option</span> <span class="TOKEN">Explicit</span>
&nbsp;
<span class="TOKEN">Dim</span> objFSO
<span class="TOKEN">Dim</span> objFoSource
<span class="TOKEN">Dim</span> objFile
<span class="TOKEN">Dim</span> arrNameParts
<span class="TOKEN">Dim</span> intSeparate
<span class="TOKEN">Dim</span> intMount
<span class="TOKEN">Dim</span> intTest
<span class="TOKEN">Dim</span> strLetters
<span class="TOKEN">Dim</span> strFoName
<span class="TOKEN">Dim</span> strMainPath
&nbsp;
<span class="TOKEN">Set</span> objFSO = WScript.CreateObject(&quot;Scripting.FileSystemObject&quot;)
<span class="TOKEN">Set</span> objFoSource = objFSO.GetFolder(&quot;D:\Datenbank\erledigt&quot;)
&nbsp;
<span class="TOKEN">For</span> <span class="TOKEN">Each</span> objFile <span class="TOKEN">In</span> objFoSource.Files
arrNameParts = Split(objFile.Name, &quot; &quot;)
<span class="TOKEN">If</span> Left(objFile.Name, 7) = &quot;WICHTIG&quot; <span class="TOKEN">Then</span>
strMainPath = &quot;D:\Datenbank\Files\WICHTIG\&quot;
strLetters = &quot;&quot;
<span class="TOKEN">Else</span>
strMainPath = &quot;D:\Datenbank\Files\Airlines\&quot;
<span class="TOKEN">If</span> Asc(LCase(Left(objFile.Name, 1))) &lt; 100 <span class="TOKEN">Then</span>
strLetters = &quot;A-C\&quot;
<span class="TOKEN">ElseIf</span> Asc(LCase(Left(objFile.Name, 1))) &lt; 107 <span class="TOKEN">Then</span>
strLetters = &quot;D-J\&quot;
<span class="TOKEN">ElseIf</span> Asc(LCase(Left(objFile.Name, 1))) &lt; 115 <span class="TOKEN">Then</span>
strLetters = &quot;K-R\&quot;
<span class="TOKEN">Else</span>
strLetters = &quot;S-Z\&quot;
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
intMount = 0
<span class="TOKEN">Do</span>
strFoName = strFoName &amp; arrNameParts(intMount) &amp; &quot; &quot;
intMount = intMount + 1
<span class="TOKEN">Loop</span> <span class="TOKEN">Until</span> objFSO.FolderExists(strMainPath &amp; strLetters &amp; Left(strFoName, _
Len(strFoName) - 1) <span class="TOKEN">Or</span> intMount &gt; <span class="TOKEN">UBound</span>(arrNameParts)
&nbsp;
<span class="TOKEN">If</span> intMount &lt;= <span class="TOKEN">UBound</span>(arrNameParts) <span class="TOKEN">Then</span>
objFSO.MoveFile objFile.Path, strMainPath &amp; strLetters &amp; Left(strFoName, _
Len(strFoName) - 1) &amp; &quot;\&quot; &amp; objFile.Name
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
strFoName = &quot;&quot;
<span class="TOKEN">Next</span> <span class="REM">'objFoSource</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Gruß Ingolf

Jack_Plumpi
18.04.2008, 18:00
Hi,

beim Loop Until schreibt er Fehler: "Typen unverträglich".
Beim Debuggen habe ich gesehen, dass der Pfad richtig kommt, aber anscheinend hatt es da was mit dem FolderExists.
Oder liege ich da falsch?

Ich finde in der VB-Hilfe diese Function auch nicht an...
Muß ich da noch einen Verweis setzen?

Super wäre noch, wenn eine Fehlermeldung kommt welcher Ordner nicht existiert bzw. wenn zB die ersten Teile des Airlinenamens nicht mit dem entsprechenden Ordnernamen übereinstimmen sollte.
zB "Singapure Air ..." statt "Singapure Airlines ..." usw.

noch was - im Code habe ich folgendes stehen, da sonst in VBA ein Fehler kommt:
Dim objFSO As New FileSystemObject

Das
'Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
ist auskommentiert.

danke & lg

IngGi
21.04.2008, 14:49
Hallo Jack_Plumpi,

in der Zeile mit der Fehlermeldung fehlt eine schließende Klammer:
<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Loop</span> <span class="TOKEN">Until</span> objFSO.FolderExists(strMainPath &amp; strLetters &amp; Left(strFoName, _
Len(strFoName) - 1)) <span class="TOKEN">Or</span> intMount &gt; <span class="TOKEN">UBound</span>(arrNameParts)
&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Die FolderExists-Methode ist keine Visual Basic - Methode, sondern eine Methode des FileSystemObject. Daher findest du auch nichts dazu in der Visual Basic-Hilfe. Im Internet gibt's unter dem Stichwort FileSystemObject aber zahlreiche Quellen. Unter anderem auch direkt bei Microsoft unter http://msdn2.microsoft.com/en-us/library/hww8txat(VS.85).aspx.

Übrigens, auch zu der Geschichte mit der Zeile
<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Set</span> objFSO = WScript.CreateObject(&quot;Scripting.FileSystemObject&quot;)
&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Mein Code ist eigentlich nicht als Visual Basic - Code gedacht (also VB6 oder was immer du für eine Version hast), sondern als Visual Basic Script - Code. Da gibt's - wie du auch schon selbst bemerkt hast - kleine Unterschiede. Wenn das jetzt so unter VB6 läuft, ok. Asonsten, kopiere den Code einfach in den Editor (nimm dazu ausnahmsweise den ganz einfachen unter Start | Programme | Zubehör | Editor (bei WordPad z.B. gibt's Probleme mit der Zeilenschaltung!) und speichere die Datei mit der Dateiendung .vbs. Per Doppelklick auf die .vbs-Datei wird das Script gestartet.

Ich habe das Script jetzt nochmal anhand einer Datei getestet und es hat bei mir funktioniert.

Gruß Ingolf

Jack_Plumpi
06.05.2008, 19:46
Hallo Ingolf!

Ja die Klammer wars!
Jetzt funktioniert das ganze wunderbar!
Habe den ersten Lauf komplett durchdebuggt - alles geht.

Ich danke dir - toll gemacht! ;)