19.2k 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)
Zu "Dateien finden" hat dir kicia bereits ein perfektes Beispiel gegeben - dort wird eine übergebene Datei erst unter c:\temp gesucht und dann unter h:\temp. Vielleicht ist dir der Aufruf nicht klar:
MsgBox( checkIfExists( "test1.txt" ) )
Bedeutet nichts anderes als
Dim s1
s1 = checkIfExists( "test1.txt" )
If s1 <> "" Then
MsgBox "existiert unter " & s1
Else
MsgBox "nicht gefunden"
End If


a123_45678_002B_10a.txt
a123_45678_002B_10b.txt
Wie gesagt, reguläre Ausdrücke verlangen schon ein längeres Lesen, Verstehen und Ausprobieren. Dir die hier zu erklären würde jeden Rahmen sprengen. Um diese Dateien zu erkennen, wäre folgendes auf eine Ausgabe von dir /b angebracht:
Dim ............, oRe2
oRe2.Pattern = "^.{14}([a-z]+)_[0-9]+([a-z]+)\.txt"
oRe2.IgnoreCase = True

Set aMatch = oRe2.Execute(sLine2)
If aMatch.Count = 2 Then
...
End If
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
und wo genau soll ich diesen teil des scriptes

MsgBox( checkIfExists( "test1.txt" ) )

Function checkIfExists( filename )
Dim arr(2), fso, i
Set fso = CreateObject("Scripting.fileSystemObject")
arr(0) = "c:/temp"
arr(1) = "h:/temp"

for i = 0 to 1
if( fso.FileExists( arr( i ) & "/" & filename ) ) Then checkIfExists = fso.GetFile( arr( i ) & "/" & filename )
next
End Function


in deinem einfügen???

und diese datei "test1.txt",ist das der name,welcher in der ausgelesene datei steht?also dieser ausdruck in der input-datei: a123_45678_000???was genau muss ich da eintragen?

Dim ............, oRe2
oRe2.Pattern = "^.{14}([a-z]+)_[0-9]+([a-z]+)\.txt"
oRe2.IgnoreCase = True

Set aMatch = oRe2.Execute(sLine2)
If aMatch.Count = 2 Then
...
End If


und dieser teil des scriptes bewirkt das er beide dateien,also den namen,speichert?

also von input-datei:

a123_45678_000

output-datei:

a123_45678_000_10a.txt
a123_45678_000_10b.txt
...und alle weiteren dateien mit dem anfang "a123_45678_000"

sorry das ich soviel nachfragen muss aber ich möchte gern das ganze ein wenig verstehen was dieser script so macht um halt nicht so oft eure zeit in anspruch zu nehmen ;)
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
Hallo.
Die Funktion "checkIfExists()" prüft nacheinander, ob die Datei "test1.txt" in den Ordnern "c:/temp", "h:/temp",... vorhanden ist, und liefert das entsprechende Dateiobjekt zurück, wenn er die Datei gefunden hat.

Die Zeile MsgBox(...) ist nicht nötig. War nur zum Testen.

"test1.txt" entspricht obigem "INPUT_DATEI.txt"

"C:/temp" und "H:/temp" musst Du natürlich anpassen, zB. wie oben "G:/daten/", "F:/weitere_daten",...

Aufruf zum Beispiel:
Dateiobjekt = checkIfExists( "test1.txt" )
oFileSystem.OpenTextFile( Dateiobjekt.path, 1)

(siehe auch File.path)
Der Block:
Function checkIfExists( filename )
...
End Function

kann irgendwo stehen, spielt keine Rolle.
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
so habe beide sachen intigriert und festgestellt das es noch nicht das ist was ich genau brauche.es fehlt sozusagen der "punkt auf dem i".bisher ist es soweit schon das was ich benötige aber noch nicht ganz.

deshalb gebe ich hier nochmal an wie es aussehen soll bzw was am ende rauskommen sollte:

eine excel-tab mit folgendem inhalt:
(das alles sind anfangs-namen für dateien)

a123-45678-000-00
a123-45679-004-00
a123-45680-010-00
a123-45681-002-00
...

die daraus folgende gezogene txt-datei:
(die input-datei)

a123_45678_000
a123_45679_004
a123_45680_010
a123_45681_002
...

nun die sache mit dem script:
(die dateien liegen auf max. 2 verschiedenen laufwerken)
also wie folgt:

auf Y:\Daten\ liegen folgende:

a123_45678_000A_20b.txt
a123_45678_000B_20b.txt
a123_45678_000C_20b.txt
a123_45678_000E_20b.txt
a123_45680_010W_10b.txt
a123_45680_010W_11k.txt
a123_45680_010W_12k.txt
a123_45680_010AA_10b.txt
a123_45680_010AA_11k.txt
a123_45680_010AA_12k.txt
a123_45680_010AC_10b.txt
a123_45681_002H_11b.txt
a123_45681_002H_22b.txt
a123_45681_002L_11b.txt
a123_45681_002L_22b.txt
a123_45681_002R_20b.txt
a123_45681_002R_10s.txt
a123_45681_002R_11k.txt
a123_45681_002R_12k.txt
...

auf Z:\Weitere_Daten\ liegen z.b. die anderen:

a123_45679_004D_20b.txt
a123_45679_004D_10s.txt
a123_45679_004D_11k.txt
a123_45679_004D_12k.txt
a123_45679_004D_10k.txt
a123_45679_004D_10d.txt
a123_45679_004Q_20b.txt
a123_45679_004Q_10s.txt
a123_45679_004Q_11k.txt
a123_45679_004Q_12k.txt
a123_45679_004Q_10k.txt
a123_45679_004Q_10d.txt
...

das script muss nun diese dateien finden und in eine output-datei schreiben:
dabei werden folgende dateien benötigt (fett hervor gehoben):
von Y:\Daten\
a123_45678_000A_20b.txt
a123_45678_000B_20b.txt
a123_45678_000C_20b.txt
a123_45678_000E_20b.txt
von Z:\Weitere_Daten\
a123_45679_004D_20b.txt
a123_45679_004D_10s.txt
a123_45679_004D_11k.txt
a123_45679_004D_12k.txt
a123_45679_004D_10k.txt
a123_45679_004D_10d.txt
a123_45679_004Q_20b.txt
a123_45679_004Q_10s.txt
a123_45679_004Q_11k.txt
a123_45679_004Q_12k.txt
a123_45679_004Q_10k.txt
a123_45679_004Q_10d.txt

wieder von Y:\Daten\
a123_45680_010W_10b.txt
a123_45680_010W_11k.txt
a123_45680_010W_12k.txt
a123_45680_010AA_10b.txt
a123_45680_010AA_11k.txt
a123_45680_010AA_12k.txt
a123_45680_010AC_10b.txt
a123_45681_002H_11b.txt
a123_45681_002H_22b.txt
a123_45681_002L_11b.txt
a123_45681_002L_22b.txt
a123_45681_002R_20b.txt
a123_45681_002R_10s.txt
a123_45681_002R_11k.txt
a123_45681_002R_12k.txt


die output-datei sieht dann wie folgt aus:

a123_45678_000E_20b.txt
a123_45679_004Q_20b.txt
a123_45679_004Q_10s.txt
a123_45679_004Q_11k.txt
a123_45679_004Q_12k.txt
a123_45679_004Q_10k.txt
a123_45679_004Q_10d.txt
a123_45680_010AC_10b.txt
a123_45681_002R_20b.txt
a123_45681_002R_10s.txt
a123_45681_002R_11k.txt
a123_45681_002R_12k.txt

und deshalb mit den 2 laufwerken,da da die dateien auf jedenfall zu finden sind.wenn er da auf beide nix findet,soll er das in die output-datei vermerken.
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
kann mir wirklich keiner dabei helfen???
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
ich mach vielleicht demnächst mal ein script, wenn ich zeit finde.

ansonsten:
was funktioniert denn nicht ?
an welcher stelle ist die ausgabe nicht wie gewünscht ?
was funktioniert schon richtig ?
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
das mit den höchsten buchstaben funktioniert super.also das er wie oben dargestellt die fettgedruckten dateien findet.also wenn der höchste buchstabe ein D ist dann soll er das nehmen,wenn aber z.b. dann ein W zu finden ist,dann das mit dem W.also das funzt super.

nur aber findet er nur die erste datei mit diesem namen.also bis zur 14. stelle ist ja alles gleich.und da findet er nur die datei welche mit diesem namen an erster stelle steht.aber es könnte dazu auch mehrere dateien geben,welche bis zum 14. buchstaben gleich sind.und das macht er noch nicht.

und das 2. ding ist,das er auf 2 verschiedene laufwerke diese dateien ausfindig machen soll.also wenn auf dem einen diese dateien,welche "in" der input-datei stehen, nicht zu finden sind,dann soll er auf ein weiteres laufwerk zugreifen.wenn auch da nix zu finden,dann ne fehlermeldung in die output-datei schreiben.also wie oben durch die bsp angegeben...
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
sehe ich das richtig:

das script soll nicht die neueste datei nehmen, unabhängig davon auf welchem laufwerk, sondern
es soll das erste laufwerk bevorzugen ?
Also, wenn die Datei auf dem ersten Laufwerk ist, soll diese genommen werden, auch wenn auf dem anderen eine neuere ist ?
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
Wollte ja eigentlich in vbs weitermachen, habs aber jetzt in javascript gemacht, da fühl ich mich mehr zu hause (sorry an son_quatsch). Ich gebe zu, mein Script ist länger, als es sein müsste. insbesondere länger als das von son_quatsch.
Aber... na, wenns tatsächlich jemanden interessiert, möge er sich melden.

ich ging gestern davon aus, daß immer die neueste datei gefunden werden soll, das macht mein script also.
ich warte aber erstmal ab, ob das wirklich nicht gewünscht war, bevor ich was ändere.

(Es wäre übrigens auch möglich, die informationen im inputfile direkt aus einer excel datei zu lesen, statt aus einer txt.)

Die Endung der Datei, die de folgenden Code enthält, muss ".hta" lauten.

[code]
<html>
<head>
<title></title>
<HTA:APPLICATION ID="xyzabc" APPLICATIONNAME="asgasd" SCROLL="yes" SINGLEINSTANCE="yes"/>

<style type="text/css">
* { font-family:courier new; font-size:14px; }
</style>

<script type="text/jscript">
//-----------------------------
var locations = {
posA: "D:/_produkte/coding/sn",
posB: "D:/_produkte/coding/sn/x",
infile: "D:/_produkte/coding/sn/in.txt",
outfile: "D:/_produkte/coding/sn/out.txt"
};

//-----------------------------
function init()
{
var list = getSortedList();
var infile = loadFile( locations.infile ).replace(/\r\n/g,"\n").split("\n");
save( checkIfInFileList( list, infile ) );
}

//-----------------------------
function checkIfInFileList( list, infile )
{
var i,temp;
var out = [];
for( i = 0; i < infile.length; i++ ) { out.push( findInList( infile[i] ) ); }
return out;

function findInList( s )
{
var i = 0;
for( i = 0; i < list.length; i++ ) { if( s == list[i].n.join("_").substr( 0, 14 ) ) return list[i]; }
return false;
}
};

//-----------------------------
function save( list )
{
var out = [];
for( var i = 0; i < list.length; i++ )
{
if( list[i].n )
{
out.push( list[i].n.join("_") );
msg( list[i].n + " - " + list[i].p + "<br>" );
}
else
{
out.push( "! datei nicht gefunden !" );
msg( "! datei nicht gefunden !<br>" );
}
}
saveFile( locations.outfile, out.join("\r\n") );
};

//-----------------------------
function getSortedList()
{
var out = new Array();
var locs = [ locations.posA, locations.posB ];
var temp, i, k;
for( i = 0; i < locs.length; i++ )
{
temp = getFiles( locs[i], 5, "txt" )[1];
for( k = 0; k < temp.length; k++ )
{
temp[k] = { p:temp[k].path, n:temp[k].name };
temp[k].p = temp[k].p.replace(/\\/g,"/");
temp[k].p = temp[k].p.substr( 0, temp[k].p.lastIndexOf("/") );
temp[k].n = temp[k].n.split(".")[0];
temp[k].n = [ temp[k].n.substr( 0, 14 ), temp[k].n.substr( 14 ) ];
out.push( temp[k] );
}
}
out.sort( sort );
out = findLast( out );
return out;

//__
function sort( a, b )
{
var i;
a = a.n;
b = b.n;
for( i = 0; i < a.length; i++ )
{
if( !b[i] ) return 1;
if( a[i].length > b[i].length ) return 1;
if( a[i].length < b[i].length ) return -1;
if( a[i] > b[i] ) return 1;
if( a[i] < b[i] ) return -1;
}
return 0;
};
//__
function findLast( arr )
{
var i = 0;
var out = new Array();
var current, last;

for( i = 0; i < arr.length; i++ )
{
current = arr[i].n.join("_").substr( 0, 14 );
if( i > 0 && last != current ) out.push( arr[ i - 1 ] );
last = current;
}
if( i > 0 ) out.push( arr[ i - 1 ] );
return out;
};
};

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
function loadFile(FileName)
{
var fso,f1;
var FileStr = "";
fso = new ActiveXObject("Scripting.Filesystemobject");
if(fso.FileExists(FileName))
{
f1 = fso.OpenTextFile(FileName, 1);
if(f1.AtEndOfStream) msg("(!) Die Datei ist leer<br>", true); else FileStr = f1.ReadAll();
f1.close();
}
else { msg("(!) Datei nicht gefunden! --->" + FileName + "<br>", true); }
return FileStr;
}

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
function saveFile(FileName,str)
{
var fso, folder, file, foldername;

//____
function getfoldername(s) { s = s.replace(/\\/g,"/"); s = s.substr( 0, s.lastIndexOf("/") ); return s; }

fso = new ActiveXObject("Scripting.Filesystemobject");
foldername = getfoldername(FileName);
if(fso.FolderExists(foldername))
{
folder = fso.Getfolder(foldername);
if(folder.attributes!=16&&folder.attributes!=48)
{
msg("[savefile] kann auf Verzeichnis nicht zugreifen ---><b>" + foldername + "</b> (att:" + folder.attributes + ")");
return false;
}
if(fso.FileExists(FileName))
{
file = fso.GetFile(FileName);
if(file.attributes!=0&&file.attributes!=32)
{
msg("[savefile] kann auf Datei nicht zugreifen ---><b>" + FileName + "</b> (att:" + file.attributes + ")");
return false;
}
}
file = fso.OpenTextFile(FileName, 2, true);
file.write(str);
file.close();
}
else
{
msg("Verzeichnis nicht gefunden! ---><b>" + foldername + "</b>");
}
}

//-----------------------------------------------------------------------------------
//-- returns an array: [ array of folder objects, array of file objects ]
//-- filter:
//-- n = 0000 (0): all folders and subfolders and all files
//-- n = 0001 (1): no folders
//-- n = 0010 (2): no files
//-- n = 0100 (4): no subfolders
//-- ext = extension as STRING
//-- part = member as STRING, eg. "name"
//-----------------------------------------------------------------------------------
function getFiles( startfolder, n , ext, part )
{
if( !n ) n = 0;
var fso = new ActiveXObject("Scripting.FileSystemObject");
var folders = new Array();
var files = new Array();
if( !fso.FolderExists( startfolder ) )
{
msg("(!) Folder " + startfolder + " not found!", true );
r
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
sehe ich das richtig:

das script soll nicht die neueste datei nehmen, unabhängig davon auf welchem laufwerk, sondern
es soll das erste laufwerk bevorzugen ?
Also, wenn die Datei auf dem ersten Laufwerk ist, soll diese genommen werden, auch wenn auf dem anderen eine neuere ist ?


oh darüber hab ich noch gar keine gedanken gemacht.

nein er soll,wenn auf dem 2. laufwerk eine "neuere" version ist (erkennbar am buchstaben bzw doppelbuchstaben),dann diese nehmen

(Es wäre übrigens auch möglich, die informationen im inputfile direkt aus einer excel datei zu lesen, statt aus einer txt.)

wie meinstn das jetzt???

und wie starte ich diesen script aus einem batch heraus?bzw wie soll ich was umbenennen damit es klappt?also die input-datei in txt lassen.

bzw wie müssen diese input-dateien heißen???


habs grad versucht zu testen,aber da wird in die output-datei folgendes geschrieben:

a123_45678_004_D_20m

aussehen soll es aber wie folgt:

a123_45678_004D_20m.txt sowie folgende weitere,sofern es weitere gibt:
a123_45678_004D_10k.txt
...

die fettgedruckte kennung ist die wichtigste

bisher soweit auch super...aber danach kommt so ne fehlermeldung "!datei nicht gefunden!" worauf bezieht sich das ganze???

das gefunden bzw in die output-datei geschrieben:

a123_45678_000D_10m
a123_45679_001AB_20b
! datei nicht gefunden !

diese dateien aber sollen drin sein:

a123_45678_000D_10k.txt
a123_45678_000D_10m.txt
a123_45679_001AB_10s.txt
a123_45679_001AB_20b.txt
...