hilfdirselbst.ch
Facebook Twitter gamper-media
Kai Rübsamen  M  p
Beiträge: 4458
21. Sep 2013, 18:19
Beitrag #1 von 12
Bewertung:
(3226 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

String: Wie Teilbereich aus String ermitteln?


Hallo!

Ich habe ein InDesign-Dokument "Magazin.indd". Mit z.B.
var str = "Magazin.indd";
str = str.slice(0, -5);

erhalte ich nur "Magazin". Soweit klar.

Ich möchte jetzt prüfen, ob in einem Ordner "Magazin.indd" oder "Magazin_1.indd" liegt. Eine neue Datei soll dann immer um 1 hochgezählt werden.

Hierzu habe ich eine Hilfsvariable lastVersion = 0, die dann mit der Zahl aus "Magazin_1.indd" verglichen werden soll.

Frage:
Mit welcher Methode komme ich jetzt nur an die Zahl innerhalb des Strings. Das Ganze muss auch funktionieren, wenn nur ein Dokument im Ordner liegt. Dann gibt es nämlich noch keine Zahl.

Ich stelle mir das in etwa so vor:
Code
var curNumber =  parseInt(curFileName.substring(das fehlt mir, curFileName.indexOf("."))); 
if(lastVersion < curNumber){
lastVersion = curNumber;

var newVersion = lastVersion + 1;
docName = docName + "_" + newVersion;
}



Danke.

Gruß Kai Rübsamen
_______________________
(Dieser Beitrag wurde von Kai Rübsamen am 21. Sep 2013, 18:20 geändert)
Top
 
X
Gerald Singelmann  M  p
Beiträge: 6178
21. Sep 2013, 19:50
Beitrag #2 von 12
Beitrag ID: #517624
Bewertung:
(3207 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

String: Wie Teilbereich aus String ermitteln?


Aus der Erinnerung (und ich benutze das nicht oft) müsste die .match Funktion dir weiterhelfen.
Code
var ding = str.match(/_\d+/); 


In "ding" stehen dann die gefundenen Zahlen. Also etwa ding[0] ist "_01";

Mehr steht im OMV.

--------------------------

InDesign-Wissen und Automatisierung nicht nur rund um die Suite.

http://www.cuppascript.com
als Antwort auf: [#517619] Top
 
Kai Rübsamen  M  p
Beiträge: 4458
21. Sep 2013, 20:16
Beitrag #3 von 12
Beitrag ID: #517626
Bewertung:
(3197 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

String: Wie Teilbereich aus String ermitteln?


Hi Gero,

das mit dem match hatte ich vorhin auch gelesen. Was mache ich aber, wenn das ding nur "Magazin" heißt. Dann findet match nix?!

Gruß Kai Rübsamen
_______________________
als Antwort auf: [#517624] Top
 
Kai Rübsamen  M  p
Beiträge: 4458
22. Sep 2013, 10:18
Beitrag #4 von 12
Beitrag ID: #517635
Bewertung:
(3133 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

String: Wie Teilbereich aus String ermitteln?


Ich weis nicht, ob es guter Stil oder gar richtig ist. Aber heute morgen funktioniert hier folgendes :) :

parseInt() kann einen String in eine Zahl wandeln, auch wenn da neben einer Zahl noch zusätzlich Text steht. Bei mir wäre das "_1" gewesen. Lt. dem Missing Manual zu Javascript von O'Reilly darf jedoch vor der Zahl nur ein "+ oder -" stehen. Daher habe ich wohl bei mir immer NAN erhalten und es wurde nichts hochgezählt. Lasse ich den Unterstrich bei der Suche weg, funktioniert es (auch wenn keine Zahl da ist).

Code
for(i=0; i<aList.length; i++){     
// das aktuelle PDF
var curFile = aList[i];
// der Name ohne Suffix
var curFileName = curFile.name.slice(0, -4);
var version = curFileName.match(/\d+$/);
// wenn keine Zahl vorhanden ist das Ergebnis NAN
var curNumber = parseInt(version);
// 0 ist nicht kleiner als NAN, daher false
if(lastVersion < curNumber){
lastVersion = curNumber;
}
}
var newVersion = lastVersion + 1;
docName = docName + "_" + newVersion;


Gibt es doch ein Dokument mit "_1" ist lastVersion < curNumber true, last Version wird von 0 auf 1 hochgezählt und dann außerhalb der Schleife als 2 (Neuer Name des nächsten PDFs). Damit die Zahl nur am Ende gefunden wird, habe ich jetzt den Suffix vorher abgetrennt und lasse die Zahl nur am Ende mit $ finden.

Gruß Kai Rübsamen
_______________________
als Antwort auf: [#517626] Top
 
Gerald Singelmann  M  p
Beiträge: 6178
22. Sep 2013, 13:49
Beitrag #5 von 12
Beitrag ID: #517645
Bewertung: ||
(3101 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

String: Wie Teilbereich aus String ermitteln?


Hi Kai,

geh mal diesen Code im ESTK schrittweise durch und schau dir die Variablen im Datenbrowser an.
Das müsste eigentlich weiterhelfen:
Code
main(); 

function main() {
var nm1 = "magazin.indd";
var nm2 = "magazin_1.indd";
var nm3 = "magazin_12.indd";

var re = /_(\d+)\.indd/;

var a = nm1.match(re);
var b = nm2.match(re);
var c = nm3.match(re);

var version = ( c == null ) ? 0 : c[1];

}


--------------------------

InDesign-Wissen und Automatisierung nicht nur rund um die Suite.

http://www.cuppascript.com
als Antwort auf: [#517635] Top
 
Kai Rübsamen  M  p
Beiträge: 4458
24. Sep 2013, 10:57
Beitrag #6 von 12
Beitrag ID: #517703
Bewertung:
(3035 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

String: Wie Teilbereich aus String ermitteln?


Antwort auf: Das müsste eigentlich weiterhelfen:

Das tutet es :) Danke!

Ich habs heute noch nicht gesagt: Der Datenbrowser ist einfach klasse, besonders wenn alles in einer Funktion liegt.

null > 0 zuzuweisen finde ich clever. So findet kein Vergleich mit NAN statt.

Sehe ich es richtig, dass
var version = ( c == null ) ? 0 : c[1];

die Kurzform von
if (c == null) {
var version = 0;
}
else {
var version = c[1];
}

ist?

Gruß Kai Rübsamen
_______________________
als Antwort auf: [#517645]
(Dieser Beitrag wurde von Kai Rübsamen am 24. Sep 2013, 10:58 geändert)
Top
 
Gerald Singelmann  M  p
Beiträge: 6178
24. Sep 2013, 11:42
Beitrag #7 von 12
Beitrag ID: #517705
Bewertung:
(3026 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

String: Wie Teilbereich aus String ermitteln?


Zitat Sehe ich es richtig, dass


Yupp.

Ich finde es schwer lesbar, aber manchmal einfach praktisch. Bei Marc Autret (glaube ich) habe ich mal etwas gelesen in Richtung:

Code
var a = ( b == null) ? 0 : ( c == null ) ? 0 : 1 


Das ist zwar erlaubt, aber da hörts für mich persönlich auf.
Ich mag es, wenn ich meinen Code auch nach einem Jahr noch verstehe ;)

--------------------------

InDesign-Wissen und Automatisierung nicht nur rund um die Suite.

http://www.cuppascript.com
als Antwort auf: [#517703] Top
 
Kai Rübsamen  M  p
Beiträge: 4458
24. Sep 2013, 11:49
Beitrag #8 von 12
Beitrag ID: #517706
Bewertung:
(3023 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

String: Wie Teilbereich aus String ermitteln?


Fein. Alles verstanden. Danke :)

Gruß Kai Rübsamen
_______________________
als Antwort auf: [#517705] Top
 
pixxxelschubser p
Beiträge: 1538
24. Sep 2013, 21:33
Beitrag #9 von 12
Beitrag ID: #517724
Bewertung:
(2951 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

String: Wie Teilbereich aus String ermitteln?


Hallo Kai,
schön, dass du eine Lösung für dich gefunden hast. Würdest du sie mit uns teilen?

Mir ist dein Dateisystem nicht ganz klar, und auch nicht, für welchen Fall du welche Lösung haben möchtest. Mein Ansatz hätte wahrscheinlich so ausgesehen (eine Dateiendung habe ich hier als gegeben vorausgesetzt):

Code
// Filename_sequenz.jsx 
// prüft, ob sich (vor dem Suffix) eine Sequenzzahl im Namen des Dateiarrays befindet und
// erhöht sie um den Zähler 1 oder fügt "_0" ein

// ! es findet keine Prüfung statt, ob bereits eine Datei mit den "neuen" Namen vorhanden ist
// Grüße pixxxelschubser

main ();
function main() {
var aList = new Array ("Magazin.pdf", "Zeitung_5.pdf", "Katalog_12.pdf");
var newNameList = [];
var oldName, newName;
var PDFName_splitt = /(.+)(\..{2,4})/;
var PDFNameNum_splitt = /(.+_)(\d+)(\..{2,4})/;

for (i = 0; i < aList.length; i ++) {
try {
oldName = aList[i].match(PDFNameNum_splitt);
newName = oldName[1] + (Number(oldName[2])+1) + oldName[3];
//alert("Dateiname alt mit Nummer: " + aList[i]);
//alert ("Dateiname neu mit Nummer: " + newName);
} catch (e) {
oldName = aList[i].match(PDFName_splitt);
newName = oldName[1] + "_0" + oldName[2];
//alert("Dateiname alt ohne Nummer: " + aList[i]);
//alert ("Dateiname jetzt neu mit Nummer: " + newName);
}
//newNameList.push (newName);
newNameList[i] = newName;
}
alert("alt: " + aList+"\nneu: "+newNameList)
}


viele Grüße
pixxxelschubser




Was wir wissen, ist ein Tropfen; was wir nicht wissen, ein Ozean.

Isaac Newton


als Antwort auf: [#517706] Top
 
Kai Rübsamen  M  p
Beiträge: 4458
25. Sep 2013, 11:13
Beitrag #10 von 12
Beitrag ID: #517744
Bewertung:
(2901 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

String: Wie Teilbereich aus String ermitteln?


Hallo Hans Jürgen,

ich wusste gar nicht, dass du auch skriptest: Wie schön :)

Deine Variante funktioniert auch. Geros Suche mit meinem Rest erscheint aber zumindest mir übersichtlicher.

Am Ende geht es darum, dass geprüft werden muss, ob es bereits ein "Magazin.pdf" im Ordner gibt. Wenn ja, muss die nächste Version "Magazin_1.pdf" lauten. Gibt es den Ordner PDF noch gar nicht, müsste der Name des ersten PDFs "Magazin.pdf" lauten.

Code
// wenn der Ordner tatsächlich da ist, prüfen, ob schon etwas drin ist 
if (pdfFolder.exists == true) {
// Gibt es schon PDFe im Ordner?
var aList = pdfFolder.getFiles(docName+"*.pdf");
// Hilfszähler wird mit 0 initialisiert
var lastVersion = 0;
// Die Schleife wird nur ausgeführt, wenn mind. ein PDF im Ordner ist
for(i=0; i<aList.length; i++){
// das aktuelle PDF
var curFile = aList[i];
// Suche nach: Unterstrich, gefolgt von Zahl mind 1x, gefolgt von Punkt und pdf
var m = curFile.name.match(/_(\d+)\.pdf/);
// falls nichts gefunden wird, wird null = 0 zugewiesen, ansonsten der tats. Wert
var version = ( m == null ) ? 0 : m[1];
// wandelt den String in eine Zahl
var curNumber = parseInt(version);
// vergleicht den Zähler mit der gefundenen Nummer
if(lastVersion < curNumber){
lastVersion = curNumber;
}
}
var newVersion = lastVersion + 1;
var c = "_" + newVersion;
}
// fehlt der Ordner, wird er angelegt. Prüfung auf Inhalt entfällt
else {
pdfFolder.create();
// in dem Fall gibt es keinen Unterstrich und keine Zahl
var c = "";
}

// dann kommt irgendwann
var pdfName = docName + '_' + curPreset + c + '.pdf';


Gruß Kai Rübsamen
_______________________
als Antwort auf: [#517724] Top
 
mx S
Beiträge: 161
25. Sep 2013, 16:34
Beitrag #11 von 12
Beitrag ID: #517757
Bewertung:
(2872 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

String: Wie Teilbereich aus String ermitteln?


Hallo Kai,

hier noch eine Variante, die das Problem von der anderen Seite her angeht (es hat mich einfach gereizt):

Code
newFileName = function (newFile, limiter){ 
if(newFile == null || newFile.constructor.name != "String")
return null;
if(limiter == null || limiter.constructor.name != "String")
limiter = "";
var currentFile = File(newFile);
var currentPath = currentFile.path + "/";
if(!Folder(currentPath).exists){
Folder(currentPath).create();
return newFile;
}
var currentFullName = currentFile.displayName;
var currentName = currentFullName.substr(0, currentFullName.length - 1 - currentFullName.split("").reverse().join("").indexOf("."));
var currentExtension = currentFullName.substring(currentFullName.length - 1 - currentFullName.split("").reverse().join("").indexOf("."));
var currentSuffix = "";
var i = 1;
while (File(currentPath + currentName + currentSuffix + currentExtension).exists){
currentSuffix = limiter + i;
i++;
}
return currentPath + currentName + currentSuffix + currentExtension;
}


$.writeln(newFileName("C:\\temp\\test.indd", "_"));


Erster Trick:
Sofort auszusteigen, sobald das Ergebnis klar ist.
Zweiter Trick:
Das Suffix mit der Zahl erst füllen, wenn klar ist, dass die Datei schon besteht.

Die Dateiendung und den Namen suche ich vom Ende her über den letzten Punkt, darum sieht das etwas ungewohnt aus.
Das Trennzeichen zwischen dem Dateinamen und der Zahl kann als zweiter Parameter frei mitgegeben werden.

Viele Grüße
Jo
als Antwort auf: [#517744] Top
 
Kai Rübsamen  M  p
Beiträge: 4458
30. Sep 2013, 19:41
Beitrag #12 von 12
Beitrag ID: #517928
Bewertung:
(2729 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

String: Wie Teilbereich aus String ermitteln?


Hallo Jo,
habs gerade getestet und bin mal ehrlich: Ich versteh nicht mal die Hälfte von dem, was du da gemacht hast. Aber sicherlich verstehen das Andere ;-)

Und: Wir haben wohl jetzt drei Lösungen! Cool. Danke an alle, die mitgedacht haben.

Gruß Kai Rübsamen
_______________________
als Antwort auf: [#517757]
(Dieser Beitrag wurde von Kai Rübsamen am 30. Sep 2013, 19:42 geändert)
Top
 
X