[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt String: Wie Teilbereich aus String ermitteln?

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

String: Wie Teilbereich aus String ermitteln?

Kai Rübsamen
Beiträge gesamt: 4684

21. Sep 2013, 18:19
Beitrag # 1 von 12
Bewertung:
(3687 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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.

(Dieser Beitrag wurde von Kai Rübsamen am 21. Sep 2013, 18:20 geändert)
X

String: Wie Teilbereich aus String ermitteln?

Gerald Singelmann
  
Beiträge gesamt: 6269

21. Sep 2013, 19:50
Beitrag # 2 von 12
Beitrag ID: #517624
Bewertung:
(3668 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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.


als Antwort auf: [#517619]

String: Wie Teilbereich aus String ermitteln?

Kai Rübsamen
Beiträge gesamt: 4684

21. Sep 2013, 20:16
Beitrag # 3 von 12
Beitrag ID: #517626
Bewertung:
(3658 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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?!


als Antwort auf: [#517624]

String: Wie Teilbereich aus String ermitteln?

Kai Rübsamen
Beiträge gesamt: 4684

22. Sep 2013, 10:18
Beitrag # 4 von 12
Beitrag ID: #517635
Bewertung:
(3594 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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.


als Antwort auf: [#517626]

String: Wie Teilbereich aus String ermitteln?

Gerald Singelmann
  
Beiträge gesamt: 6269

22. Sep 2013, 13:49
Beitrag # 5 von 12
Beitrag ID: #517645
Bewertung: ||
(3562 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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];

}



als Antwort auf: [#517635]

String: Wie Teilbereich aus String ermitteln?

Kai Rübsamen
Beiträge gesamt: 4684

24. Sep 2013, 10:57
Beitrag # 6 von 12
Beitrag ID: #517703
Bewertung:
(3496 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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?


als Antwort auf: [#517645]
(Dieser Beitrag wurde von Kai Rübsamen am 24. Sep 2013, 10:58 geändert)

String: Wie Teilbereich aus String ermitteln?

Gerald Singelmann
  
Beiträge gesamt: 6269

24. Sep 2013, 11:42
Beitrag # 7 von 12
Beitrag ID: #517705
Bewertung:
(3487 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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 ;)


als Antwort auf: [#517703]

String: Wie Teilbereich aus String ermitteln?

Kai Rübsamen
Beiträge gesamt: 4684

24. Sep 2013, 11:49
Beitrag # 8 von 12
Beitrag ID: #517706
Bewertung:
(3484 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Fein. Alles verstanden. Danke :)


als Antwort auf: [#517705]

String: Wie Teilbereich aus String ermitteln?

pixxxelschubser
Beiträge gesamt: 1708

24. Sep 2013, 21:33
Beitrag # 9 von 12
Beitrag ID: #517724
Bewertung:
(3412 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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)
}



als Antwort auf: [#517706]

String: Wie Teilbereich aus String ermitteln?

Kai Rübsamen
Beiträge gesamt: 4684

25. Sep 2013, 11:13
Beitrag # 10 von 12
Beitrag ID: #517744
Bewertung:
(3362 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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';



als Antwort auf: [#517724]

String: Wie Teilbereich aus String ermitteln?

mx
Beiträge gesamt: 161

25. Sep 2013, 16:34
Beitrag # 11 von 12
Beitrag ID: #517757
Bewertung:
(3333 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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]

String: Wie Teilbereich aus String ermitteln?

Kai Rübsamen
Beiträge gesamt: 4684

30. Sep 2013, 19:41
Beitrag # 12 von 12
Beitrag ID: #517928
Bewertung:
(3190 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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.


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