1.7k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von romero Mitglied (323 Punkte)
hallo liebe gemeinde,

ich habe da wieder ein kleines für euch, ein großes problem für mich.

ich versuche eine weitere spalte an eine bestimmte liste dranzuhängen.

der unten aufgeführte script soll euch ein wenig dabei helfen.

dieses script liest erst einmal daten aus einer exceltabelle aus. die daten was er auslesen soll, werden vorher mittels einem hauptscript an die include.js übermittelt. diese daten beinhalten, die exceldatei, -tabelle, zeilenanfang, spaltenanfang, ausgangsdatei, arbeitsordner, ...

nachdem die liste aus excel ausgelesen wurde, wandelt er diese um, um sie für weitere zwecke zu gebrauchen. nachdem umwandeln werden die entsprechenden daten aus einem großen ordner gesucht und in eine von mir vorgegebene ausgangsdatei gespeichert.

bsp.:
excelliste:

a123-45678-000-00 (a123-45678-000 -> hauptteil der datei)
a123-45679-002-00
...

umgewandelte liste:

a123_45678_000
a123_45679_002
...

ungewandelte liste ist im script die "infile"!!!

die "list" ist die gesamte liste aus dem ordner, wo alle dateien drin sind.

das script vergleicht nun unter function checkifinfilelist() ob die infile zu der liste passt. wenn ja, dann gibt er die entsprechende liste aus.

in der liste sind alle dateien enthalten. aber benötigt wird nur die aktuellste datei, erkennbar an einem kennbuchstaben.
sollten also mehrere dateien mit dem hauptteil der infile vorhanden sein, dann soll er nur die "entnehmen", welche den höchsten buchstaben haben.

a123_45678_000A
a123_45678_000B
a123_45679_002D
a123_45679_002AA
...

das wird bereits bewerkstelligt.

aber ab und zu kommt es auch dazu das unter einem bestimmten hauptteil und dem akt. buchstaben, verschiedene materialien existieren. d.h. eine infile kann aus mehreren teilen bestehen.

bsp:
a123_45678_000B

a123_45678_000B_10b
a123_45678_000B_11b
a123_45678_000B_12b
...

jetzt müssen alle gespeichert werden, da sie ja die einzelnen teile sind, welchen den hauptteil wiederspiegeln. das macht das script ebenfalls.

aber nun kommts. wie schaffe ich, dass die entsprechende anzahl zu infile auch zur entsprechenden list passt?

ich denke, es liegt in der function checkifinfilelist(), da da infile und list verglichen wird.

die anzahl aus der excelliste sieht so aus:

a123-45678-000-00 // 5
a123-45679-002-00 // 22 (-> // spiegelt die andere spalte wieder)

aussehen am ende muss es so:

a123_45678_000B_10b_5
a123_45678_000B_11b_5
a123_45678_000B_12b_5

a123_45679_002AA_11b_22
a123_45679_002AA_22b_22
...

habe versucht, die anzahl am ende einzufügen, aber da macht er nur folgendes:

a123_45678_000B_10b_5
a123_45678_000B_11b_22
a123_45678_000B_12b_(andere anzahl)
...

wenn ich aber bei function checkifinlifelist(), bei function findinlist() die anzahl mit angebe, bringt er mir für die anzahl "undefined", weil list größer ist als die tatsächliche liste des ordners.

also nun die frage an euch. Wie bekomm ich wie oben unter "aussehen am ende muss es so:" beschrieben, die entsprechende anzahl unter die einzelnen einzelteilen?

lg romero

3 Antworten

0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
//-----------------------------
//-- Initialisierung
//-----------------------------
function init()
{
var infile, list, out, anzahl;

msg( "<br>--- Excel Datei laden: ---<br>" );

infile = loadExcelFile( locations.infile, locations.startSheet );
infile = deleteEmpty( infile );
infile = convertInfile( infile );

//--> Excelliste auslesen, leeren Inhalt löschen, Infile (ausgelesene Excelliste) für das Auslesen vorbereiten

anzahl = loadExcelFile( locations.infile, locations.startSheet );
anzahl = deleteEmpty( anzahl );
anzahl = convertAnzahl( anzahl );

//--> Excelliste auslesen, leeren Inhalt löschen, Anzahl (ausgelesene Excelliste) für das Auslesen vorbereiten

msg( "<br>--- Dateien finden: ---<br>" );

list = getSortedList( [ locations.posA, locations.posB, locations.posC ] );
list = findLast( list );

//--> Dateien finden, Liste sortieren. Liste ist ein Array von Objekten: { p = Pfad, n = File }
//--> jeweils letzte Datei finden, und alle anderen Einträge löschen

out = checkIfInFileList( list, infile, anzahl );

//--> Dateien und Infile vergleichen, sowie deren Anzahl anhängen

save( out );

if( Eingabewerte.STL_vorhanden == "Ja" || Eingabewerte.STL_Tür_Links_vorhanden == "Ja" || Eingabewerte.STL_Tür_Rechts_vorhanden == "Ja" || Eingabewerte.STL_Tür_LinksRechts_vorhanden == "Ja" )
{
document.getElementById( "STL_Meldungen_Überschreiben" ).style.display = "inline";
document.getElementById( "STL_Meldungen_Alt_Text" ).style.display = "inline";
document.getElementById( "STL_Meldungen_Alt_Text" ).disabled = true;
document.getElementById( "Überschreiben_Alt_Text" ).disabled = true;
document.getElementById( "Alt_Text" ).disabled = true;
}

return;
};

//------------------------------------------
//-- 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)
{
STL_Meldungen_Fehler( "(!) 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.startCol1 ).Text + currentRange.Cells( y + 1, locations.startCol1_1 ).Text );
}

for ( y = locations.startRow; y < currentRange.Rows.Count; y++ )
{
out.push( currentRange.Cells( y + 1, locations.startCol2 ).Text + currentRange.Cells( y + 1, locations.startCol2_2 ).Text );
}
}

//--> Matten-Spalte auslesen und Anzahl-Spalte an die Stückliste zeilenweise anhängen

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 );
}
}
STL_Meldungen_Fehler( "(!) Tabelle '" + name + "' nicht gefunden (!)" );
return false;
}
};

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

//--> alle leeren Eintragungen werden gelöscht

out.pop();

//--> der letzte Eintrag wird gelöscht

return out;
};

//------------------------------------------------------
//-- leere Elemente der Anzahl löschen
//------------------------------------------------------
function deleteEmpty( anzahl )
{
var i = 0;
var out_anz = [];
for( i = 0; i < anzahl.length; i++ )
{
if( anzahl[ i ] ) { out_anz.push( anzahl[i] ); }
}

//--> alle leeren Eintragungen werden gelöscht

out_anz.pop();

//--> der letzte Eintrag wird gelöscht

return out_anz;
};

//---------------------------------------------
//-- Infile konvertieren, Ausgabe zur kontrolle
//---------------------------------------------
function convertInfile( infile )
{
var i = 0; var last = "";
for( i = 0; i < infile.length; i++ )
{
if( infile[ i ] )
{
last = infile[ i ].substr( 0, 14 );

infile[ i ] = convertFileNameToObject( infile[ i ] );

msg( "infile: " + last + " / " + i + " " + infile[ i ] + "<br>" )
}
}

return infile;
};

function convertFileNameToObject( fn )
{
fn = fn.replace( /-/g, "_" );
fn = fn.substr( 0, 14 );

out = fn;
return out;
}

//---------------------------------------------
//-- Anzahl konvertieren, Ausgabe zur kontrolle
//---------------------------------------------
function convertAnzahl( anzahl )
{
var i = 0; var last = "";
for( i = 0; i < anzahl.length; i++ )
{
if( anzahl[ i ] )
{
last = anzahl[ i ].substr( 0, 14 );

anzahl[ i ] = anzahl[ i ].substr( 17 , 3 );

//if( anzahl[ i ] == 1 ) { anzahl[ i ] = "" };

msg( "Anzahl: " + last + " ( " + anzahl[ i ] + " )<br>" )
}
}

return anzahl;
};

//---------------------------------
//-- vorhandene Stückliste einlesen
//---------------------------------
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("(!) vorhandene Datei nicht gefunden! --->" + FileName + "<br>", true);
}

return FileStr;
}

//-----------------------------
function checkIfInFileList( list, infile, anzahl )
{
var i, temp;
var out = [];

for( i = 0; i < infile.length; i++ )
{
out = out.concat( findInList( infile[i] ) );
}

return out;

function findInList( s )
{
var i = 0;
var out = [];
for( i = 0; i < list.length; i++ )
{
if( s == list[i]
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
[code]
//----------------------------------------------------------------------------
//-- gefundene Materialien in einer Liste speichern und zur Kontrolle ausgeben
//----------------------------------------------------------------------------
function save( list )
{
var out = [];

for( var i = 0; i < list.length; i++ )
{
if( list[i].n )
{
out.push( list[i].n.join("") + ".nc" );
msg( i + " " + list[i].n + " // ( " + list[i].anzahl + " ) - " + list[i].p + "<br>" );
}
else
{
out.push( "! datei nicht gefunden: '" + list[i] + "'" );
msg( i + " " + "! datei nicht gefunden '" + list[i] + "' !<br>" );
}
}

var infile_vorhanden = loadFile( locations.workFolder_STL + locations.outfile1 ).replace(/\r\n/g,"\n").split("\n");

vergleich( out , infile_vorhanden )

//-------------------------------------------------------------------------------
//-- Ausgabedatei und vorhandene Stückliste vergleichen und Unterschiede ausgeben
//-------------------------------------------------------------------------------
function vergleich( infile_neu , infile_vorhanden )
{
for( var i = 0; i < infile_neu.length; i++ )
{
infile_neu[i] = infile_neu[i].substr( 0 , 15 );
}

for( var i = 0; i < infile_vorhanden.length; i++ )
{
infile_vorhanden[i] = infile_vorhanden[i].substr( 0 , 15 );
}

infile_neu.sort();
infile_vorhanden.sort();

if( infile_neu.length == infile_vorhanden.length )
{

document.getElementById( "STL_Meldungen_Überschreiben" ).innerHTML = '<p class="STL_Meldungen_Überschreiben">Wollen Sie die Stückliste Überschreiben? <input type="button" value="Bestätigen" class="STL_Meldungen_Button" onclick="kommt_noch( out )"></input> <input type="button" value="Abbrechen" class="STL_Meldungen_Button" onclick="Überschreiben_Abbrechen()"></input>';

msg( "<br><b>Es wurden keine Unterschiede gefunden." );
}
else
{
for( var i = 0; i < infile_neu.length && infile_vorhanden.length; i++ )
{
if( infile_neu[i] != infile_vorhanden[i] )
{

document.getElementById( "STL_Meldungen_Überschreiben" ).innerHTML = '<p class="STL_Meldungen_Überschreiben">Wollen Sie die Stückliste Überschreiben? <input type="button" value="Bestätigen" class="STL_Meldungen_Button" onclick="kommt_noch( out )"></input> <input type="button" value="Abbrechen" class="STL_Meldungen_Button" onclick="Überschreiben_Abbrechen()"></input>';

msg( "<br><b>Unterschiede: </b>" + infile_vorhanden[i] + " --> <b>" + infile_neu[i] + "</b>" );
}
}
}

};

//saveFile( locations.workFolder1 + locations.outfile1, out.join("\r\n") );
};

//---------------------------------------------------------
//-- Speichern der Stückliste - Überschreiben und Abbrechen
//---------------------------------------------------------
function Überschreiben_Abbrechen()
{
STL_Meldungen_Fehler( "Ihre Stückliste(n) " + locations.Bereich + "<br>wurde nicht gespeichert." );
};

function kommt_noch( out )
{
out = out;

saveFile( "C:/test/" + locations.outfile1, out.join("\r\n") );
};

//---------------------------------------------------------
//-- Liste in vorgegebenen Ordner durchsuchen und speichern
//---------------------------------------------------------
function getSortedList( locs )
{
var out = new Array();
var temp, i, k;
for( i = 0; i < locs.length; i++ )
{
temp = getFiles( locs[i], 5 )[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] );
}
}

//--> Dateien finden

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;

//--> Liste sortieren

};
};

function findLast( arr )
{
var i = 0;
var out = new Array();
var temp = [];
var current000, last000;
var currentX, lastX;
var current00x, last00x;

for( i = 0; i < arr.length; i++ )
{
current000 = arr[i].n[0];
current00x = arr[i].n[1].split("_")[1];
currentX = arr[i].n[1].split("_")[0];
if( last000 != current000 )
{
out = out.concat( temp );
temp = [];
}
if( i > 0 && lastX != currentX ) { temp = []; }
temp.push( arr[ i ] );
last000 = current000;
lastX = currentX;
last00x = current00x;
}
return out;

//--> Letzten Eintrag finden, sprich höchste Aktualität (ISSUE)

};

//------------------------------------------
//--Liste im entsprechendem Ordner 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)
{
STL_Meldungen_Fehler("[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)
{
STL_Meldungen_Fehler("[savefile] kann auf Datei nicht zugreifen ---><b>" + FileName + "</b> (att:" + file.attributes + ")");
return false;
}
}
file = fso.OpenTextFile(FileName, 2, true);
file.write(str);
file.clo
0 Punkte
Beantwortet von romero Mitglied (323 Punkte)
wenn ich aber bei function checkifinlifelist(), bei function findinlist() die anzahl mit angebe, bringt er mir für die anzahl "undefined", weil list größer ist als die tatsächliche liste des ordners.


richtig muss es heißen:

wenn ich aber bei function checkifinlifelist(), bei function findinlist() die anzahl mit angebe, bringt er mir für die anzahl "undefined", weil list größer ist als die länge der einträge der anzahl.
...