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 romero Mitglied (323 Punkte)
nur die Datei vom 1. Laufwerk
[quote]Zitat:
Aber ist es nicht egal, welches Laufwerk verwendet wird ? In der Output datei steht doch gar nicht der Pfad, oder doch ?


Ich meine, in der Output datei steht ja nur der Dateiname. Wenn der auf beiden Laufwerken identisch ist, ist es egal, aus welcher der listen man den Dateinamen nimmt, um ihn in die outputdatei zu schreiben.[/quote]

stimmt,mein fehler.ist ja nur der datei name wichtig.bzw das er trotz das die datei doppelt vorkommt,nur einmal in der output-datei vorkommen muss.

Zähler:
Meinst Du das so ?:
- in der Input datei stehen mehrere Identische Namen
- in der output datei soll hinter jeder Datei die Anzahl aller entsprechenden Einträge in der input datei stehen

Es kommt mir nur seltsam vor, darum frage ich lieber nochmal. Es sollen nicht die gefundenen Dateien gezählt werden, sondern die Einträge in der Inputdatei, richtig ?


richtig...

Ich hab ja Spaß daran. Ich helfe gerne weiter, wenn ich Zeit habe.
Aber ich empfehle, daß Du Dir ganze genau Gedanken machst, was das Script jetzt oder später vielleicht können soll. Ich hätte vermutlich ganz anders angefangen, wenn ich von Anfang an richtig verstanden hätte, worum es geht. ZB wäre es sehr leicht gewesen, so einen Zähler einzubauen. Im Nachhinein ist es viel komplizierter, oder aber man müsste das ganze Script umbauen.


ok also da fangsch ma an...

die gezogene excel-txt sieht wie folgt aus:

a123-44500-002 1
a123-45001-004 2
a123-44502-000 1
a123-44503-008 1
a123-44504-002 1
a123-44505-010 1
...
a123-40000-002 1
a123-40000-002 1
a123-40000-002 1
56 (-> ist die gesamtanzahl der nummern)

und diese datei hab ich ja mittels einem kleinen batch umgewandelt bzw umgeschrieben.also

a123_44500_002
a123_45001_004
a123_44502_000
a123_44503_008
a123_44504_002
a123_44505_010
...
a123_40000_002
a123_40000_002
a123_40000_002

das ist ja auch die sozusagene input-datei.aber das könnte man doch in deinem script doch mit einbringen oder?also das ich diesen batch erst gar nicht benutze sondern,da du die nummer eh zerlegst,das das script das gleich mit macht???

dein script hat ja nun erfolgreich die dateien gezogen mit dem höchsten (oder die 2 höchsten buchstaben)

die zahl hinter der nummer (also die 1) gibt die anzahl der nummer wieder.wie man sieht kommt da jede nummer nur einmal vor.es kann aber u.u. vorkommen das eine nummer 2 oder mehrmals vorkommt.diese wird wie folgt angeben (in der output-datei).

a123_44500_002A_ 10bc
a123_45001_004AA_20b_2.nc
a123_44502_000F_20b.nc
a123_44503_008F_10b.nc
a123_44504_002E_....nc
a123_44505_010S_....nc
...
a123_40000_002AB_..._3.nc

die fett-gedruckten geben die anzahl der nummern wieder...also ne art zählung.also einmal durch zählen der gleichen nummern und zum anderen der aus der gezogenen excel-txt wird die anzahl wieder gegeben.

und wenn wir dabei sind,gibt es da noch ein weiteres ding...
wenn bei bestimmten inputdateien gezogene dateien zum vorschein kommen,also wenn die gesuchten dateien hinten als material ein 10s besitzen,dann sollen diese ganzen mit 10s in eine nach mir angegebe datei gespeichert werden,das selbe mit den als material-definierten k (also alle wie 10k,11k,12k,...),die werden in eine weitere extra datei gespeichtert.alle dann mit b oder m oder so (müsste ich dann in dem script explizit angeben),in eine wieder extra datei.

also ne art ausklammerung nach material.

nun kommt es zu meinem weiteren problem.wichtig ist dabei das material mit der 10s.nicht alle nummern weisen dieses material auf.wenn also das script eine nummer findet,wo keine 10s dabei ist,soll sie an das ende der datei mit dem b oder m gelegt werden.und wenn es keine 10s gibt,dann gibt es auch keine 1k bzw 12k.diese 3 materialien kommen immer zusammen vor.sprich.ist das eine nicht da,dann können auch die 2 anderen nicht da sein.wenn aber eine fehlt,dann soll ne fehler meldung ausgegeben werden...und die dateien welche das nicht aufweisen,kommen an das ende der b oder m datei.

hoffe du hast es soweit verstanden was ich meine...
wie gesagt bekomm es übern batch hin aber das ans ende schmeißen der bestimmten nummern halt nicht...

lg romero
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
Da sollten wir dann etwas 'objektorientierter' werden. Da brauch ich aber ein bischen Zeit, die ich gerade nicht habe.
Ich habe vor, die Einträge in der Infile aufzuteilen in:

function infileSet( brN, bpK, v, iss, mat, matK, z )
{
this.baureihenNummer = brN;
this.bauplatzKennung = bpK;
this.variante = v;
this.issue = iss;
this.material = mat;
this.materialKategorie = matK;
this.zaehler = z;
}

function convertInfileSetToObject( ifSet )
{
var out = new infileSet( 0,0,0,0,0,0,0 );
out.baureihenNummer = "";
out.bauplatzKennung = "";
out.variante = "";
out.issue = "";
out.material = "";
out.materialKategorie = "";
out.zaehler = 0;
return out;
}

function convertInfile( infile )
{
var i = 0;
for( i = 0; i < infile.length; i++ )
{
infile[ i ] = convertInfileSetToObject( infile[ i ] );
}
return infile;
}

function init()
{
...
infile = loadFile( locations.infile ).replace(/\r\n/g,"\n").split("\n");
infile = convertInfile( infile );
...
}



Aber in der Funktion convertInfileSetToObject() muss dann die eigentliche trennung erfolgen. Dazu später mehr.

Bitte verwende konsequent Namen für alles, das macht die Kommunikation (und auch das Scripten) wirklich bedeutend einfacher.
Ich habe mir mal für den Buchstaben der materialien (zB das 'k' von '10k') eine Bezeichnung ausgedacht. Vielleicht hast Du eine bessere Bezeichnung, korrigiere mich bitte gerne.

a123-44500-002 1

Wie ist denn der - ich nenne ihn mal 'Zähler' - in der Infile Exceldatei vom rest getrennt ? Eigene Spalte oder mit Leerzeichen ? Und wie in der Infile.txt ? Mit Leerzeichen oder Tab ?


Ich weiss nicht, ob Du schon was damit anfangen kannst, aber vielleicht willst Du ja schon mal herumprobieren.
So würde ich die Exceldatei direkt auslesen:


...
var infile = loadExcelFile( locations.infile );
...

//---------------------------------
//---------------------------------
function loadExcelFile( fileName )
{
var x, y;
var currentRange;
var excelApp = new ActiveXObject("Excel.Application");
var wbin = excelApp.Workbooks.Open( fileName );
var out = new Array();
var row = new Array();

if( wbin.Sheets.Count > 0 )
{
currentRange = wbin.Sheets(1).UsedRange;

for ( y = 0; y < currentRange.Rows.Count; y++ )
{
for ( x = 0; x < currentRange.Columns.Count; x++ )
{
row.push( currentRange.Cells( y + 1, x + 1 ).Text );
}
out.push( row );
row = [];
}
}

wbin.Close();
excelApp.Quit();
return out;
}

Allerdings ist die Variable 'infile' dann (je nach aufbau der Exceldatei) ein mehr dimensionales Array.
Beispielsweise würde auf die erste Spalte der 10. Zeile so zugegriffen werden:
infile[ 9 ][ 0 ]
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
function infileSet( brN, bpK, v, iss, mat, matK, z )
{
this.baureihenNummer = brN;
this.bauplatzKennung = bpK;
this.variante = v;
this.issue = iss;
this.material = mat;
this.materialKategorie = matK;
this.zaehler = z;
}


Also hab ich es richtig verstanden.du willst sozusagen die input-daten zerlegen und diese teile,welche ich nannte,nach variablen benennen???nur damit ich es verstehe…


Ich weiss nicht, ob Du schon was damit anfangen kannst, aber vielleicht willst Du ja schon mal herumprobieren.
So würde ich die Exceldatei direkt auslesen:



...
var infile = loadExcelFile( locations.infile );
...

//---------------------------------
//---------------------------------
function loadExcelFile( fileName )
{
var x, y;
var currentRange;
var excelApp = new ActiveXObject("Excel.Application");
var wbin = excelApp.Workbooks.Open( fileName );
var out = new Array();
var row = new Array();

if( wbin.Sheets.Count > 0 )
{
currentRange = wbin.Sheets(1).UsedRange;

for ( y = 0; y < currentRange.Rows.Count; y++ )
{
for ( x = 0; x < currentRange.Columns.Count; x++ )
{
row.push( currentRange.Cells( y + 1, x + 1 ).Text );
}
out.push( row );
row = [];
}
}

wbin.Close();
excelApp.Quit();
return out;
}


Allerdings ist die Variable 'infile' dann (je nach aufbau der Exceldatei) ein mehr dimensionales Array.
Beispielsweise würde auf die erste Spalte der 10. Zeile so zugegriffen werden:

infile[ 9 ][ 0 ]


Also du die excel-tab direkt auslesen?also das ich diesen weg über den vbs-script gar nicht gehe (sprich diese ausgelesene txt-datei als input-datei) sondern willst das er direkt auf die exceltab zugreifen kann???auf die einzelnen excel-tabs mit den entsprechenden müsste ich über den batch zugreifen…sprich ich geb vorher an z.b. D000 und dann den bereich z.b. E000 und da müsste er in die excel-tab D000 springen und das tabellenblatt E000 aufrufen und dann weiter verarbeiten.und das erfolgt über den batch. „auslesen.vbs“ (script), „c:/daten/excel-tab_%maschinentyp%“ (excel-tab), %bereich% (tabellenblatt).und so müsste es auch bei deinem script dann aussehen.je nachdem was ich eingebe,da müsste er dann zugreifen können (sofern es da ist :D).

Ok dann kann ich folgendes dazu sagen:
Die nummern a123-45678-000-00 (so stehen die da in der excel-tab drin) beginnen immer ab der 8. zeile und stehen in der 3. spalte (bzw. 9. spalte -> da es auf A4 gedruckt werden soll),die anzahl der nummern stehen in der 2. bzw. 8. spalte).wie gesagt,durch einen script lese ich diese excel-tab mit dem entsprechendem worksheet aus… das was ich halt durch meinen batch eingebe…


Zitat:
a123-44500-002 1

Wie ist denn der - ich nenne ihn mal 'Zähler' - in der Infile Exceldatei vom rest getrennt ? Eigene Spalte oder mit Leerzeichen ? Und wie in der Infile.txt ? Mit Leerzeichen oder Tab ?


Er ist durch einen leerzeichen getrennt,aber das ist dann wenn du direkt auf die excel-tab zugreifen willst dann nicht so wichtig oder???also der zähler steht in der 2. spalte bzw. 8. (wenn genügend nummern da sind).


Bitte verwende konsequent Namen für alles, das macht die Kommunikation (und auch das Scripten) wirklich bedeutend einfacher.
Ich habe mir mal für den Buchstaben der materialien (zB das 'k' von '10k') eine Bezeichnung ausgedacht. Vielleicht hast Du eine bessere Bezeichnung, korrigiere mich bitte gerne.


Ok wird ich versuchen…
Versuch es dir noch mal genau beschreiben:
Die nummer setzt sich wie du bereits erkannt hast aus vielen teilen zusammen,die aber keine so wichtige rolle spielen wie das ende der gesamten nummer.
Sprich: a123-45678-000-00 -> nummer in der excel-tab
Daraus ergibt sich auf den laufwerken,wie du bisher mit deinem 1. perfekten script erfolgreich bewiesen hast,folgende datei-nummern:
A123_45678_000AB_10s.nc
A123_45678_000AB_10k.nc
A123_45678_000AB_11k.nc
A123_45678_000AB_12k.nc
A123_45678_000AB_20b.nc

Nun gibt es aber 2 bereiche (sprich outputfiles -> welche ich dann endgültig für weitere zwecke benötige) wo die eigentliche output-datei in 3 dateien ausgeklammert werden.

A123_45678_000AB_10s.nc
A123_45678_000AB_10k.nc
A123_45678_000AB_11k.nc
A123_45678_000AB_12k.nc
A123_45678_000AB_20b.nc

Die hinter dem issue AB stehende zahlen mit dem buchstaben (10 und k) geben zum einen die materialstärke (10,11,12,…) an zum anderen das material (k,s,m,b,…).bei den beiden bereichen,wo das in 3 extra bereiche reinmuss,müssen diese ausgeklammert werden.sprich s (oder weitere,muss ich dann explizit angeben) in den 1. bereich (z.b. STL_D000_TE000.txt -> stl=stückliste,D000=maschinentyp,TE000=bereich),k,… in den 2. bereich (STL_D000_FE000.txt) und b,… in den 3. bereich (STL_D000_E000.txt).
Abhängig sind die reihenfolgen in den dateien von dem 1. bereich,das mit dem s (TE000).sollte es aber vorkommen,das eine nummer kein material s ausweist (alle müssen aber den gleichen issue besitzen) und somit keine k’s dann soll diese (weil es ja im TE000 nicht vorkommt,weil nicht gefunden) im bereich E000 ans ende geschmissen werden…
Sollte aber die k’s geben aber kein s,dann sollte es ne fehlermeldung geben,sozusagen das das material fehlt.also diese 3 teile (10s,11k,12k) gehören fast immer zusammen…

Wichtig wäre noch zusagen das ich bei den materialkenn-buchstaben noch weitere hinzufügen müsste,sprich:also das in den jeweiligen bereiche E000,FE000,TE000 nicht nur b,k oder s vorkommen kann…

Hoffe hab nun das ganze noch genauer beschrieben worum es mir geht als vorher.wenn es vorher etwas undurchsichtlich war bitte ich es zu entschuldigen…
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
jetzt bin ich etwas verwirrt...

Es existiert also ein Script "auslesen.vbs" ? Und das ist nicht das Script von son_quatsch, sondern das gab es schon, bevor Du hier gepostet hast, ja ?
Das muss ja jemand geschrieben haben, kann derjenige denn da nicht weiterhelfen ?

Zur Klarheit: das "auslesen.vbs" ist ein visual basic script, kein batch.
Ein batch wäre (in Windows) eine datei "xyzabc.bat" (oder "xyzabc.cmd").

Im wesentlichen unterscheiden sich in Windows die Möglichkeiten von .vbs (Dein Script) und .js (mein Script, Javascript) nicht sehr.
Das Script von son_quatsch war ja auch vbs.
Man könnte sagen, es ist beides "Windows scripting", und man kann sich aussuchen, welche Sprache man bevorzugt.
Ich fühle mich eben mit Javascript wohler als mit visual basic script.

Mein Script ist in eine .hta Datei eingebunden, damit es die Grafischen Elemente von HTML benutzen kann. Es bleibt aber hauptsächlich ein Javascript.
Man kann auch Dein vbs script in die .hta Datei einbinden.

Ist das Script denn sehr groß ? Wenn nicht, könntes Du es vielleicht posten.
Dann können wir es entweder einfach anpassen und benutzen, oder es mit dem Javascript kombinieren.
Das ganze auslesen der Exceldatei ist dann ja wohl schon vorhanden, muss man dann ja nicht nochmal schreiben.

du willst sozusagen die input-daten zerlegen

Richtig. Zerlegen müssen wir den Dateinamen sowieso.
Es ist ja nichts anderes, was wir bisher gemacht haben: wir haben die Teile des Namens getrennt voneinander behandelt.
Wenn es jetzt komplizierter wird (die Teile mehrmals an verschiedenen Stellen benötigt werden), lohnt es sich, die Namen im Vorwege zu teilen, dann kann man später bequemer damit hantieren.

Er ist durch einen leerzeichen getrennt,aber das ist dann wenn du direkt auf die excel-tab zugreifen willst dann nicht so wichtig oder?

richtig.


Deine weiteren Erläuterungen waren aufschlussreich. Daraus ergibt sich wiederum eine etwas andere Datenstruktur als sinnvoller.

Ich werde also ( das '10k' betreffend ) das k als 'material' bezeichnen, und die 10 als 'materialstärke'.
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
jetzt bin ich etwas verwirrt...

Es existiert also ein Script "auslesen.vbs" ? Und das ist nicht das Script von son_quatsch, sondern das gab es schon, bevor Du hier gepostet hast, ja ?
Das muss ja jemand geschrieben haben, kann derjenige denn da nicht weiterhelfen ?

Zur Klarheit: das "auslesen.vbs" ist ein visual basic script, kein batch.
Ein batch wäre (in Windows) eine datei "xyzabc.bat" (oder "xyzabc.cmd").

Im wesentlichen unterscheiden sich in Windows die Möglichkeiten von .vbs (Dein Script) und .js (mein Script, Javascript) nicht sehr.
Das Script von son_quatsch war ja auch vbs.
Man könnte sagen, es ist beides "Windows scripting", und man kann sich aussuchen, welche Sprache man bevorzugt.
Ich fühle mich eben mit Javascript wohler als mit visual basic script.

Mein Script ist in eine .hta Datei eingebunden, damit es die Grafischen Elemente von HTML benutzen kann. Es bleibt aber hauptsächlich ein Javascript.
Man kann auch Dein vbs script in die .hta Datei einbinden.

Ist das Script denn sehr groß ? Wenn nicht, könntes Du es vielleicht posten.
Dann können wir es entweder einfach anpassen und benutzen, oder es mit dem Javascript kombinieren.
Das ganze auslesen der Exceldatei ist dann ja wohl schon vorhanden, muss man dann ja nicht nochmal schreiben.


ne das script kommt von einem anderen...er hat es auch von irgendjemanden hier her kopiert und mir das dann sozusagen überbracht.
ja das batch ist ja was anderes als ein script von dir,son_quatsch oder halt das von dem anderen.

das script ist nicht sehr groß.kann es hier posten,aber wenn du durch deinen script direkt zugreifen kannst,ohne das dann ne excel-tab-txt ausgelesen wird,
würde ich es eher bevorzugen,also alles in einem...

so wie es für mich klang,willst du keine ausgelesene.txt für deinen script haben (aus der excel-tab) sondern die einzelnen zeilen und spalten direkt verwendet oder???

script excel-export.vbs

col=3
start_row=8
dim args,fso,ifile,ofile,sheet_name
set fso=createobject("scripting.filesystemobject")
set args=wscript.arguments.named
if not args_ok then wscript.quit
set workbook=get_workbook(ifile)
set sheet=get_sheet_by_name(workbook,sheet_name)
last_row=sheet.range(chr(col+64)&"65535").end(-4162).row
if last_row<start_row then
wscript.echo "Keine Einträge in Spalte "&col&" gefunden!"
wscript.quit
end if
set o=fso.opentextfile(ofile,2,true)
for row=start_row to last_row
o.writeline sheet.cells(row,col).value&space(1)&sheet.cells(row,col+4).value
next
o.close
workbook.close

function get_workbook(workbook_file)
dim excel
on error resume next
set excel=createobject("excel.application")
error=err
on error goto 0
if error then
wscript.echo "Kann Excel nicht öffnen! Error Code: "&error
wscript.quit
end if
on error resume next
set get_workbook=excel.workbooks.open(workbook_file)
error=err
on error goto 0
if error then
wscript.echo "Kann '"&workbook_file&"' nicht öffnen! Error Code: "&error
wscript.quit
end if
end function

function get_sheet_by_name(workbook,name)
dim sheet
for each sheet in workbook.sheets
if lcase(sheet.name)=lcase(name) then
set get_sheet_by_name=sheet
end if
next
if vartype(get_sheet_by_name)<>9 then
wscript.echo "Tabelle '"&name&"' nicht gefunden!"
workbook.close
wscript.quit
end if
end function

function args_ok
args_ok=true
if not args.exists("input") then
wscript.echo "Input Argument fehlt!"
args_ok=false
else
ifile=args.item("input")
if not fso.fileexists(ifile) then
wscript.echo "'"&ifile&"' nicht gefunden!"
args_ok=false
end if
end if
if not args.exists("worksheet") then
wscript.echo "Workbook Argument fehlt!"
args_ok=false
else
sheet_name=args.item("worksheet")
end if
if not args.exists("output") then
wscript.echo "Output Argument fehlt!"
args_ok=false
else
ofile=args.item("output")
on error resume next
set o=fso.opentextfile(ofile,2,true)
o.close
error=err
on error goto 0
if error then
wscript.echo "Kann '"&ofile&"' nicht schreiben! Error Code: "&error
args_ok=false
end if
end if
fso.deletefile ofile
end function


Ich werde also ( das '10k' betreffend ) das k als 'material' bezeichnen, und die 10 als 'materialstärke'.


ist es schwierig,diese nummern mit den entsprechenden materialkenn-buchstaben in verschiedene dateien unterzubringen???

weil für die anderen bereiche,welche ich angebe,ist der bisherige script perfekt...
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
Ich hatte noch nicht genug Zeit, aber wollte nicht so lange nix von mir hören lassen. Darum hier schon mal der Teil zum Excel auslesen:

Aufruf des Scriptes ist jetzt zB.:
findfiles.hta -c:&#92;temp&#92;infile.xls -Tabelle1 -c:&#92;temp&#92;out.txt

[code]

        function init()
        {
            ...
            getCommandline();
            infile = loadExcelFile( locations.infile, locations.startSheet );
            ...
        }

        //----------
        function getCommandline()
        {
            var cmln = xyzabc.commandLine.replace(/ /g,&quot;&quot;).replace(/&#92;&#92;/g,&quot;/&quot;).split(&quot;-&quot;);
            if( cmln.length == 4 )
            {
                locations.infile     = cmln[1];
                locations.startSheet = cmln[2];
                locations.outfile    = cmln[3];
            }
            msg( &quot;Commandline: &lt;br&gt;&quot; + cmln.join(&quot;&lt;br&gt;&quot;) + &quot;&lt;br&gt;&quot; );
        };

        //----------
        function loadExcelFile( fileName, sheetName )
        {
            var x, y;
            var currentRange;
            var currentSheet;
            var excelApp = new ActiveXObject(&quot;Excel.Application&quot;);
            var wbin;
            var out      = new Array();
           
            try
            {
                wbin     = excelApp.Workbooks.Open( fileName );
            }
            catch(e)
            {
                msg( &quot;(!) konnte Datei nicht öffnen: &quot; + fileName );
                return [];
            }
           
            currentSheet = get_sheet_by_name( wbin, sheetName );
            if( currentSheet )
            {
                currentRange = currentSheet.UsedRange;
       
                for ( y = locations.startRow; y &lt; currentRange.Rows.Count; y++ )
                {
                    out.push( currentRange.Cells( y + 1, locations.startCol ).Text );
                }
            }
       
            wbin.Close();
            excelApp.Quit();
            return out;

            function get_sheet_by_name( wb, name )
            {
                var i;
                for( i = 1; i &lt; wb.Sheets.Count + 1; i++ )
                {
                    if( wb.Sheets( i ).name == name )
                    {
                        return wb.Sheets( i );
                    }
                }
                msg( &quot;Tabelle &#39;&quot; + name + &quot;&#39; nicht gefunden!&quot; );
                return false;
            }
        }[/code]
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
keine ursache mit dem "bisher noch keine zeit gehabt bzw dem nur kurz melden".

bin froh das mir überhaupt einer bei dieser sache hilft,da das batch nur beschränkte möglichkeiten hat sowas zu tun und ich im scripten noch keine ahnung hab.
obwohl ich mich eigentlich schnell in sowas reinfinden kann.

super sache.werde dann sozusagen diesen script als startscript nehmen,bzw das was bisher bei mir als excel-auslese-script dient...

ma ne frage ausserhalb dieser sache:
bist ja sicherlich im html ziemlich gut bewandert.kannst du dann auch php???weil hab zwar so'n buch darüber (n fettes büchlein) aber ist doch eher schwierig.denn hab ma die idee gehabt,
nen browsergame zu machen...aber das erachtet sich als eher schwierig als irgendwie lösbar.aber dazu kann man ja vllt später ma bissl drüber reden...
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
Nanu, ich hatte doch schon vor ner Woche geantwortet ?
Keine Ahnung, was falsch gelaufen ist. Tut mir leid. Also nochmal in Kurzfassung:

PHP kann ich nicht ausreichend.
Hab mal ein kleines Spiel in Javascript gemacht, aber das hat ja so seine Nachteile.
Wenn Du mit PHP anfangen willst, empfehle ich, erstmal jede menge kleinkram zu coden, um mit der Technik fit zu werden. Sonst musst Du Dich immer mit der Programmiersprache beschäftigen, und kannst Dich gar nicht auf den Inhalt des Spieles konzentrieren. So ein Spiel zu machen ist doch schon etwas komplizierter.

Ich poste gleich nochmal den aktuellen code.
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
Verdammt. Jetzt weiss ich was falsch gelaufen war. Man kann nur bis zu 10000 Zeichen senden. Sehe ich ja auch ein.
Tut mir leid, ich hätte das letzte Woche überprüfen sollen, ob das gesendet wurde.
Ich hoffe, wir bekommen keinen Ärger. Ich denke, wir missbrauchen das Forum sowieso ein bischen.

Also, start mit zB.:
C:\temp\findfiles.hta -C:\temp\infile.xls -Tabelle1 -out.txt

Teil 1 (Hauptdatei):
[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" src="findfiles_include.js"></script>
<script type="text/jscript">
//-- 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
};

//-- Start des Scriptes
function init()
{
var infile, list, out;
getCommandline(); // Kommandozeilen parameter auslesen

msg( "<br>--- Excel Datei laden: ---" );
infile = loadExcelFile( locations.infile, locations.startSheet ); // Excel datei laden, infile ist jetzt ein Array von Strings
infile = deleteEmpty( infile ); // leere Elemente löschen
infile = convertInfile( infile ); // infile in ein Array von c_infileSet() objekten konvertieren

msg( "<br>--- Dateien finden: ---" );
list = getSortedList( [ locations.posA, locations.posB ] ); // Dateien finden, liste sortieren. Liste ist ein Array von objekten: { p = Pfad, n = c_infileSet() objekt }
list = findLast( list ); // jeweils letzte Datei finden, und alle anderen Einträge löschen

for( var i = 0; i < list.length; i++ ) // Datei liste zur Kontrolle anzeigen
{
msg( list[i].p + " : " + list[i].n.showText() );
}

// Dateien und infile vergleichen.
// out ist ein c_infileSet() objekt, wenn Datei gefunden, oder ein String, wenn keine Datei gefunden
msg( "<br>-- Datei liste und infile vergleichen: --" );
out = checkIfInFileList( list, infile );
for( var i = 0; i < out.length; i++ ) // Datei liste zur Kontrolle anzeigen
{
//if( out[i].n ) msg( out[i].p + " : " + out[i].n.showText() );
//else msg( out[i].showText() );
}
save( out );
return;
}

//-- infile Array in c_infileSet() objekte konvertieren
function convertInfile( infile )
{
var i = 0; var last = ""; var zaehler = 1;
infile.sort();
for( i = 0; i < infile.length; i++ )
{
if( infile[ i ] )
{
if( last == infile[ i ] ) zaehler++; else zaehler = 1; // identische Dateinamen zählen
last = infile[ i ]; //
infile[ i ] = convertFileNameToObject( infile[ i ] ); // Element im Array in c_infileSet() objekt konvertieren
infile[ i ].zaehler = zaehler; // Zähler im c_infileSet() objekt setzen
msg( "infile: " + last + " / " + i + " " + infile[ i ].showText() ) // ausgabe zur kontrolle
}
}
return infile;
}

//-- ein Element in c_infileSet() objekt konvertieren
function convertFileNameToObject( fn )
{
var out = new c_infileSet();
fn = fn.replace( /-/g, "_" );
fn = fn.split(".");
if( fn.length == 2 ) out.extension = fn[ 1 ];
fn = fn[0].split("_");
if( fn.length > 2 )
{
out.baureihenNummer = fn[0];
out.bauplatzKennung = fn[1];
out.variante = fn[2];
out.issue = out.variante.substr( 3 );
out.variante = out.variante.substr( 0, 3 );
}
if( fn.length > 3 )
{
out.material = fn[3];
out.materialStaerke = out.material.substr( 0, 2 );
out.material = out.material.substr( 2 );
}
return out;
}

//-----------------------------
function checkIfInFileList( list, infile )
{
var i,temp;
var out = [];
for( i = 0; i < infile.length; i++ ) { out = out.concat( findInList( infile[i] ) ); } // zu jedem Eintrag in infile eine Datei suchen
return out;
function findInList( s )
{
var i = 0;
var out = [];
for( i = 0; i < list.length; i++ ) { if( s.showText( 3 ) == list[i].n.showText( 3 ) ) out.push( list[i] ); }
if( out.length == 0 ) return [s];
return out;
}
};

//-----------------------------
function getSortedList( locs )
{
var out = new Array();
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 = convertFileNameToObject( temp[k].n );
out.push( temp[k] );
}
}
out.sort( sort );
return out;

function sort( a, b )
{
var i;
var aa = [ a.n.showText( 3, "_" ), a.n.issue, a.n.material + a.n.materialStaerke ];
var bb = [ b.n.showText( 3, "_" ), b.n.issue, b.n.material + b.n.materialStaerke ];
for( i = 0; i < aa.length; i++ )
{
if( !bb[i] ) return 1;
if( aa[i].length > bb[i].length ) return 1;
if( aa[i].length < bb[i].length ) return -1;
if( aa[i] > bb[i] ) return 1;
if( aa[i] < bb[i] ) return -1;
}
return 0;
};
};

//----------------------------
function findLast( arr )
{
var i = 0;
var out = new Array();
var temp = [];
var last = new c_infileSet();

for( i = 0; i < arr.length; i++ )
{
current = arr[i].n;
if( last.variante != current.variante )
{
out = out.concat( temp );
temp = [];
}
if( i > 0 && last.issue != current.issue ) { temp = []; }
temp.push( arr[ i ] );
last = arr[i].n;
}
return out;
};

//-- liste zur ausgabe vorbereiten und speichern
function save( list )
{
var out = []; // liste gefundener dateien, geordnet nach material
var outNotFound = []; // liste nicht gefundener dateien
var materialList = []; // liste der materialien ( s, k, ... )
var currentDir = getCurrentDirectory();
var i = 0;

for( i = 0; i < list.length; i++ )
{
if( list[i].n )
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
Teil 2 ( Datei: "findfiles_include.js" )

//--------------------------------------
//-- Kommandozeilen parameter auslesen
//--------------------------------------
function getCommandline()
{
var cmln = xyzabc.commandLine.replace(/ /g,"").replace(/\\/g,"/").split("-");
if( cmln.length == 4 )
{
locations.infile = cmln[1].replace(/\\/g,"/");
locations.startSheet = cmln[2];
locations.outfile = cmln[3].replace(/\\/g,"/");
}
if( locations.infile.indexOf("/") != -1 ) locations.workFolder = locations.infile.substr( 0, locations.infile.lastIndexOf("/") );
if( locations.workFolder.indexOf("/") == -1 ) locations.workFolder = getCurrentDirectory();
msg( "--- Commandline: --- <br>" + cmln.join("<br>") + "<br>" );
};

//------------------------------------------------------
//-- leere Elemente löschen
//------------------------------------------------------
function deleteEmpty( infile )
{
var i = 0;
var out = [];
for( i = 0; i < infile.length; i++ )
{
if( infile[ i ] ) { out.push( infile[i] ); }
}
return out;
};

//-------------------------------------------------
//-- check if element exists in array
//-------------------------------------------------
function elmExists( arr, e )
{
var i = 0;
for( i = 0; i < arr.length; i++ ) { if( arr[i] == e ) return true; }
return false;
}

//-----------------------------------------------------------------------
//-- Text in Datei speichern
//-----------------------------------------------------------------------
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>");
}
}

//-----------------------------------------------------------------------------------
//-- get current directory
//-----------------------------------------------------------------------------------
function getCurrentDirectory()
{
var wssh = new ActiveXObject("WScript.Shell");
return wssh.CurrentDirectory.replace(/\\/g,"/");
}

//-----------------------------------------------------------------------------------
//-- Dateien finden
//-----------------------------------------------------------------------------------
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 );
return [ [],[] ];
}
getNext( startfolder );
return [ folders, files ];

function getNext( fld )
{
var folderObj = fso.getFolder( fld );
var filesEn, foldersEn;
var tmp = "";
if( (n & 2) == 0 )
{
filesEn = new Enumerator( folderObj.Files );
for (; !filesEn.atEnd(); filesEn.moveNext())
{
tmp = filesEn.item().name;
if( typeof(ext) == 'undefined' || tmp.substr( tmp.length - ext.length, ext.length ).toLowerCase() == ext.toLowerCase() )
{
if( typeof(part) != 'undefined' && filesEn.item()[part] != 'undefined' )
files.push( filesEn.item()[part] )
else
files.push( filesEn.item() );
}
}
}
if( (n & 1) == 0 )
{
folders.push( folderObj );
foldersEn = new Enumerator( folderObj.SubFolders );
if( (n & 4) == 0 )
{
for (; !foldersEn.atEnd(); foldersEn.moveNext()) getNext( foldersEn.item().path );
}
}
}
}

//------------------------------------------
//-- Exceldatei laden, Array zurückliefern
//------------------------------------------
function loadExcelFile( fileName, sheetName )
{
var x, y;
var currentRange;
var currentSheet;
var excelApp = new ActiveXObject("Excel.Application");
var wbin;
var out = new Array();

try { wbin = excelApp.Workbooks.Open( fileName ); }
catch(e)
{
msg( "(!) konnte folgende Datei nicht öffnen: '" + fileName + "'" );
return [];
}

currentSheet = get_sheet_by_name( wbin, sheetName );
if( currentSheet )
{
currentRange = currentSheet.UsedRange;
for ( y = locations.startRow; y < currentRange.Rows.Count; y++ )
{
out.push( currentRange.Cells( y + 1, locations.startCol ).Text );
}
}
wbin.Close();
excelApp.Quit();
return out;

function get_sheet_by_name( wb, name )
{
var i;
for( i = 1; i < wb.Sheets.Count + 1; i++ )
{
if( wb.Sheets( i ).name == name )
{
return wb.Sheets( i );
}
}
msg( "Tabelle '" + name + "' nicht gefunden!" );
return false;
}
}

//-----------------------------
//-- Anzeige von Texten
//-----------------------------
function msg( s ) { document.getElementById("msgs").innerHTML += s + "<br>"; }
...