18.6k Aufrufe
Gefragt in WindowsXP von romero Mitglied (323 Punkte)
hallöchen.

hab da folgenden sachverhalt.möchte eine ausgelesene (aus Excel) txt-datei mit folgendem inhalt (der inhalt der txt spielt keine große rolle):

a123-45678-000-00
a123-45679-001-00
...

dieser inhalt soll nun mit folgender FOR-schleife umbenannt und in eine neue txt gespeichert werden:

FOR /F "tokens=1,2,3 delims=-" %%a IN (test.txt) DO (
DIR C:\test\%%a_%%b_%%c >> test_neu.txt
)


ergebnis:

a123_45678_000
a123_45679_001
...

das klappt schon gut.

nun geht es aber weiter.nun steht aber,wenn er diese daten aus dem laufwerk zieht an der 15. stelle (gezählt wird ab der 1. stelle) ein buchstabe.je höher der buchstabe,desto aktueller ist die datei, sprich a < d < z < aa < ...

wenn ich aber mit der oben genannten "formel" das laufwerk auslese, bringt er mir alle dateien die bis zur 14. stelle so heißen.

er soll aber nur den aktuellsten nehmen,der der den höchsten buchstaben hat und diese in eine txt speichern.

hab schon versucht mit folgender formel das ganze zu machen, aber so richtig ist es noch nicht das was ich will.

FOR /F "tokens=1,2,3 delims=-" %%a IN (test.txt) DO DIR C:\test\ %%a_%%b_%%c FOR /L %%x IN (0,1,15) DO (
IF [%%x] EQU [14] IF [%%x] EQU [B] (
ECHO ok
)
)


also in worten ausgedrückt:

erst liest er die gezogene txt aus und sucht die entsprechende datei.dann soll er überprüfen (wenn er mehrere dateien mit dem selben namen (wie gesagt,bis zur 15. stelle gibt es mehrere dateien) findet),welche die aktuellste ist und diese dann in eine txt speichern.

so soll es aussehen:

gezogene txt:

a123-45678-000-00
a123-45679-001-00
...

umgewandelte txt:

a123_45678_000
a123_45679_000
...

gefundene dateien:

a123_45678_000A_20b.txt
a123_45678_000B_20b.txt
a123_45678_000D_20b.txt

a123_45679_001B_20b.txt
a123_45679_001H_20b.txt
a123_45679_001L_20b.txt
a123_45679_001W_20b.txt
a123_45679_001AA_20b.txt

...

endgültige bzw fertige txt:

a123_45678_000D_20b.txt
a123_45679_001AA_20b.txt
...

und das bekomm ich nicht hin.

hab zwar auch mit FINDSTR probiert aber da sucht er nur die raus die er mit dem entsprechendem buchstaben findet.also wenn er alle mit *B* findet,dann schreibt er diese raus,wenn er aber auch nach *C* suchen soll,dann nimmt er diese auch raus und da beißen sich dann 2 dateien,da nur die eine,die aktuellste gebraucht wird.

kann mir da einer helfen?vielen dank im voraus schonmal.

Romero

48 Antworten

0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Sowohl für euch als auch für das SN wäre es wohl angebrachter Dienste wie z.B: pastebin.com zu nutzen.
Mehr Zeichen, auf Wunsch sogar Syntax-Highlighting.
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
kann die gar nicht sagen wie dankbar ich bin...

werde sie gleich mal testen.

aber ma ne frage:

der erste teil (also der hauptteil) ist der teil, wo die exceltab ausgelesen wird und gleichzeitig verarbeitet wird oder?sprich wo er dann diese dateien findet,zuordnet und speichert.
so wie bei deinem 1. script,welcher gefunzt hat...

oder muss ich dein script zum auslesen der exceltab noch mit verwenden???

und was macht der 2. script???

und das ist wie bisher die eingabe welche ich dem script mitteile,wo was ist oder?

//-- Voreinstellungen
var locations = {
posA: "H:/Konstantin/coding/sn/findFiles/Ordner1",
posB: "H:/Konstantin/coding/sn/findFiles/Ordner2",
infile: "-unbekannt-",
outfile: "-unbekannt-",
startSheet: "-unbekannt-",
workFolder: "-unbekannt-",
startRow: 8,
startCol: 3


da muss ich gleich nochma watt fragen. diese eingaben lege ich ja mit dieser eingabe fest oder?

C:\temp\findfiles.hta -C:\temp\infile.xls -Tabelle1 -out.txt


kann ich auch mehrere tabellen eingeben? und ist die out.txt die wirkliche out.txt welche dann am ende gebraucht wird???
also hab ich dann u.u. 3 output-dateien?also die sortierung nach den kennbuchstaben "s" | "k" (eventuell noch 1,2 weitere) | "b","m",...

aber da ich ja einen batch habe und die eingabe jederzeit sich ändert bzw nicht immer konstant ist,soll bei posA bzw posB bzw ...,je nachdem was ich da vorher angebe (also flugzeugtyp),
der entsprechende ordner "angewählt" werden. bei dem vb-script einfach über die eingabe %flugzeugtyp% für z.b. den ordner... geht das hier auch?
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
Hallo,

Das 1. Script verlinkt auf das 2.
Das hab ich nur gemacht, damit ich es senden kann. Wenn Du Dir das zutraust, kannst Du die Funktionen des 2. einfach in das 1. einfügen, und den link ganz oben löschen.
Ansonsten müssen nur beide im selben verzeichnis sein.

Mehrere Tabellen geht nicht. Das würde auch wieder erheblichen neuen Aufwand bedeuten. Das Script ist ja sowieso schon sehr viel größer geworden, als Ursprünglich vorgesehen.

Die out.txt enthält eigentlich nur noch Nachrichten über nicht gefundene Dateien.
Alles andere werden in neue Dateien wie "out_b.txt, out_k.txt,..." geschrieben.
Das wird in der function save( list ) in der Zeile
saveFile( locations.workFolder + "/out_" + materialList[i] + ".txt", out[ materialList[i] ].join("\r\n") );

festgelegt.

Erstmal schauen, ob alles soweit funktioniert.

Gruß
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
hallo kicia,

nachmals einen herzlichen dank für die hilfe...

der script rattert,soviel kann ich erstmal sagen.aber:er hört irgendwie mittendrin auf.weiß nicht ob ich da was vergessen hab einzutragen???

hab folgende eintragungen gemacht:

//-- Voreinstellungen
var locations = {
posA: "H:/Dateien_einlesen/Flugzeugtyp",
posB: "O:/Dateien_aufgeräumt/Flugzeugtyp",
infile: "G:/Flugzeugtyp/Stueckliste/Flugzeugtyp.xls",
outfile: "C:/test/output.txt",
startSheet: "Ber_D059",
workFolder: "C:/temp",
startRow: 8,
startCol: 3


bei posA und posB trage ich ja die ordner ein,wo die dateien zu finden sein sollen bzw. zu finden sind.
bei infile trage ich den ordner ein,wo die exceltabelle steht
bei outfile den ordner,wo die outputdatei stehen soll (mit deren namen)
bei startsheet das tabellenblatt,welches ausgelesen werden soll
bei workfolder den ordner,welchen er benutzen soll für die zwischenspeicherung der daten oder???

wenn ich da irgendwelche fehler gemacht hab,bei der eintragung,dann bitte sagen.

bisher macht er folgendes:

er überprüft die eingaben und meldet sich,wenn fehler sind.bis dato sind keine vorhanden.
dann liest er die exceltab aus und gibt sie mir wieder bzw zeigt sie an,welche in dem tabellenblatt stehen.
danach listet er alle dateien auf,welche in den oben bei posA und posB angegebenen ordnern,gefundenen worden sind (könnte man diesen schritt auch weglassen???).
dann vergleicht er die excelliste mit den gefundenen dateien ab und zeigt an,welches material es besitzt (anhand der exceltabelle).

und dann hört er auf.denn dann kommt eine meldung: "kann verzeichnis nicht finden ----> G:/Flugzeugtyp/StuecklisteC:/test" (das sieht dann so aus,also ein mix aus in- und outfile,soweit wie ich es jetzt erkennen kann - diese meldung kommt in der findfile-includes.js vor,an der stelle:
msg("Verzeichnis nicht gefunden! ---><b>" + foldername + "</b>")
bei Text in Datei speichern).

irgendein fehler von mir???

und da hab ich noch paar fragen an dich.kann man dem script auch sagen,das da eine weitere spalte zum auslesen dient?also nicht nur die 3 spalte ab der 8. zeile,sondern auch die 7 spalte ab der 8. spalte.

und wie kann ich dem script sagen oder wo kann ich den namen der outputfile für die entsprechenden materialen ändern,das es dann z.b. so heißt:
für material mit der kennung "s" soll es "T+angebener_Bereich.txt",für "k" = "F+angebener_Bereich",für "b" = "angebener_Bereich" heißen (TD059,FD059,D059).

gruß romero
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
Hallo Romero,

'outfile' soll nur ein Dateiname sein, kein vollständiger pfad. Also nur zB. 'out.txt' und nicht 'c:\temp\out.txt'.

wenn Du das script wie vorgesehen in der form startest:
C:\temp\findfiles.hta -C:\temp\infile.xls -Tabelle1 -out.txt
dann sollten diese angaben die anderen (im script vorgegebenen) überschreiben.
Hast Du diese schreibweise verwendet ? Was genau hast Du angegeben ?

Zu den gewünschten erweiterungen:
Sei mir nicht böse, aber ich gehe erstmal nicht auf weitere Änderungswünsche ein, sonst wird das Script niemals fertig.
Es ist sowieso inzwischen vom Umfang her eigentlich schon eher ein Programm als ein Script.
Und jede neue funktionalität kann wieder fehler enthalten und muss geprüft und separat und im kontext 'betrachtet' werden.
Eine funktionalität mehr heisst also nicht nur ein paar zeilen mehr, sondern das ganze wird um einen faktor komplizierter.

Deine letzte Frage wird teilweise in Antwort 43 beantwortet. Die Umsetzung ist leider zugegebenermassen nicht so mal eben gemacht.

Lass uns das bestehende erstmal fertig machen.
Sag bescheid, ob es mit meinen Tips funktioniert.

Gruß
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
hallöchen,

die gute nachricht zuerst.das script funzt,also er liest aus excel aus,sucht fast alle dateien in den angegebenen ordnern und vergleicht diese dann mit den daten aus der excelliste ab und schreibt sie je nach dem welches material es hat in die entsprechende outputdateien.

aber:kann bei dem auflisten der dateien in den angegebenen ordnern es so sein,das er da nur etwa 90% auflistet?also anhand der datenmenge nicht mehr schafft?also wenn er die liste aus excel ausliest dann die ordner anzeigt und dann vergleicht,dann bringt er mir u.u. ne fehlermeldung das er diese nicht gefunden hat,obwohl sie aber da sind und auch dementsprechend genauso heißen wie alle anderen.denn bei dem vorherigem script,da hat er diese daten gefunden,nur jetzt nicht mehr... (in den ordnern liegen teilweise über 4000 dateien,kann es damit zusammen hängen???).

das nächste ist,kann er eine weitere spalte noch mit auslesen?also die ersten daten (da dann ein ausdruck auf a4 erfolgt und die restlichen daten in eine 2. spalte legen) liegen in der 3. spalte,die anderen daten in der 7. spalte.

und der zähler geht auch nicht,also wenn mind. 2 identische daten da sind,dann speichert er auch alle nach und nach ab aber zählt deren anzahl nicht.

ich weiß das ich da sehr viel verlange.bin in der hinsicht auch eher ein perfektionist.also wenn es gemacht werden soll dann aber perfekt,sorry das ich da so viel verlange.weiß ja nicht das meine fragen bzw anforderungen so kompliziert sind umzusetzen...dafür entschuldige ich mich natürlich...

gruß romero
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
wenn Du das script wie vorgesehen in der form startest:
C:\temp\findfiles.hta -C:\temp\infile.xls -Tabelle1 -out.txt
dann sollten diese angaben die anderen (im script vorgegebenen) überschreiben.
Hast Du diese schreibweise verwendet ? Was genau hast Du angegeben ?


hier habe ich es einmal mit der eingabeaufforderung bzw batch gemacht.da wird nix überschrieben sondern da meckert er das er bei der infile was angegeben haben möchte,also die datei wo er auslesen kann.wenn ich unbekannt stehen lasse,dann gibt er dann kann "unbekannt" nicht finden.wenn es leer ist dann ebenfalls.

wenn ich aber diese werde vom batch bzw eingabeaufforderung so eingebe,also direkt hinter den infile,outfile,... dann macht er es...
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
4000 Dateien sollten eigentlich kein Problem sein.
Ich kann das Problem leider hier nicht nachvollziehen.
Welchen Dateinamen hat es denn Beispielsweise nicht gefunden, und was zeigt das script an ?

Eine weitere Spalte auslesen wäre eine neue funktionalität. Das würde vermutlich einige weitere Wochen bis Monate Arbeit an diesem Script bedeuten. Ich werde erstmal nur versuchen, alles zum laufen zu bringen, was bisher gewünscht war.

Zähler:
sorry, hab ich übersehen. Ich probiere mal den Tip von son_quatsch aus:
pastebin.com/m1daf5358
Ersetze mal diese beiden funktionen, dann sollte der Zähler angezeigt werden, hoffe ich.

Zu Deinem letzten post (Antwort 47):
Ich hab nicht verstanden: gibts da jetzt noch ein Problem? Wenn ja, was genau hast Du angegeben ? (Wenn nein, gut.)

Gruß,
...