Dateiname auf Vorkommen prüfen

adms

Neues Mitglied
Hallo zusammen,

ich bin neu hier und hoffe es kann mir jemand helfen. Vermutlich ist es ein Einfaches für euch ;-)

Ich habe folgendes Anliegen: Ich würde gerne einen Dateinamen auf Unterstriche prüfen. Die Dateinamen sind in der Länge variabel. Einzige Unterscheidung der Namen sind die Anzahl Unterstriche. Entweder gibt es die Datei mit 7 oder 8 Unterstrichen. Ich möchte gerne eine wenn dann Abfrage erstellen, die zuerst auf die Anzahl der Unterstriche prüft. Also wenn im Dateinamen 8 Unterstriche vorhanden sind, dann soll er dies machen und bei 7 soll er was anderes machen.

Ich habe bereits versucht hier etwas mit Regex-Ausdrücken zu erstellen, komme aber einfach nicht weiter.

Java:
//Dateiname veraendern


var FileNameGroup1 = DocName.split("_")[0]; //von links 1. Instanz

var FileNameGroup2 = DocName.split("_")[1]; //von links 2. Instanz

var FileNameGroup3 = DocName.split("_")[2]; //von links 3. Instanz

var FileNameGroup4 = DocName.split("_")[3]; //von links 4. Instanz

var FileNameGroup5 = DocName.split("_")[4]; //von links 5. Instanz

var FileNameGroup6 = DocName.split("_")[5]; //von links 6. Instanz

var FileNameGroup7 = DocName.split("_")[6]; //von links 7. Instanz

var FileNameGroup8 = DocName.split("_")[7]; //von links 8. Instanz

var FileNameGroup9 = DocName.split("_")[8]; //von links 9. Instanz


var regex = /w[_]{8}/

var matches = DocName.match(regex);


if (matches) {


var newFileName = FileNameGroup1;


}


else {


var newFileName = FileNameGroup1 + "_" + FileNameGroup2 + "_" + FileNameGroup4 + "_" + FileNameGroup5 + "_" + FileNameGroup6 + "_" + FileNameGroup7 + "_" + FileNameGroup8;


}

Ich freue mich auf eure Hilfe.

Vielen Dank.
 
Ich verstehe gerade nicht so ganz Dein Problem.

Wieso machst Du nicht einfach ein split Aufruf und prüfst dann, wie viele Elemente Du in dem Array zurück bekommen hast? Und ohne einen solchen Check hast Du immer das Problem des IndexOutOfBoundsException, wenn Du auf nicht existierende Elemente zugreifst.

Und was genau willst Du machen? Der Code sieht so aus, als ob die Anzahl ggf. egal ist und Du einfach mit einer Schleife den neuen Namen erstellen könntest...

Ansonsten die üblichen Hinweise: In Java ist es üblich, variablen mit einem kleinen Buchstaben zu beginnen.
 
Mal so aus dem Ärmel geschüttelt:

Java:
var filename = "yourfilename";
int underlinecount;

underlinecount = filename.replaceAll("[_]", "").length();

if(underlinecount == 7){
    //...mach irgendwas
}

if(underlinecount == 8){
    //...mach irgendwas anders
}

Wenn du viele Dateinamen hast, dann mach das lieber mit einer ArrayList, das
 
underlinecount = filename.replaceAll("[_]", "").length();
Sollte das nicht eher etwas sein wie [^_]?
Du willst alles ersetzen, was kein _ ist. So ersetzt du nur die Underscore Zeichen und hast dann nur den Rest - die Länge wäre dann die Anzahl der Zeichen, die kein Unterstrich sind. Oder habe ich das jetzt auf die Schnelle falsch gesehen?
 
Im konkreten Fall vermutlich schon, im Allgemeinen liefert das aber nicht die Zahl der Unterstriche, weil Unterstriche am Ende nicht gezählt werden. Dazu müsste man etwas wie dateiname.split("_", Integer.MAX_VALUE) verwenden.
Ja, das ist durchaus richtig - nur eben ist die Frage, was wirklich die genauer Anforderung ist. Denn es scheint in dem Post ja doch darum zu gehen, mit den jeweiligen Bausteinen etwas zu machen - also somit explizit eben nicht nur um das reine Zählen der '_' zu gehen. Und da ist dann ggf. der split aufruf das, was der Lösung am nächsten kommt.

Wobei man natürlich auch ein Regulären Ausdruck aufbauen kann, also ggf. etwas wie:
[^_]*_[^_]*_[^_]*_[^_]*_[^_]*_[^_]*_[^_]*_[^_]*
Also Blöcke, die keine _ enthalten getrennt durch _
Das ggf. noch mit Caption Blöcken versehen um dann die einzenen Blöcke zu bekommen. Und genau das ist so halt nicht wirklich sinnvoll. Da dann doch lieber die split Lösung (meine ich) 🙂
 
Guten Morgen zusammen.

Vielen Dank für die zahlreichen Beiträge. Ich habe es heute morgen direkt einmal eingebaut und getestet. Und was soll ich sagen: Es funktioniert genau so wie ich es mir vorgestellt habe! Herzlichen Dank.

Dieser Schnipsel war es am Ende:
Java:
underlinecount = docname.split("_").length - 1;

Das Programm unterscheidet nun nach einem Dateinamen mit 7 oder 8 Unterstrichen und setzt die zuvor aufgeteilten Blöcke wieder zu einem neuen Dateinamen zusammen.
 
Super, dass Du für Dich eine Lösung gefunden hast und danke, dass Du diese mit uns geteilt hast. Ich möchte aber noch einmal auf zwei Dinge hinweisen:

a) Hinweis von @mihe7 in #10: (Evtl. hast Du es auch direkt selbst schon so verstanden - ich will nur sicher gehen, dass es nicht unter gegangen ist) Es gibt einen Unterschied zwichen den folgenden beiden Aufrufen:
underlinecount = docname.split("_").length - 1;
underlinecount = docname.split("_", Integer.MAX_VALUE).length - 1;

Wenn am Ende leere Blöcken kommen, dann unterscheidet sich die Ausgabe, d.h. bei docname =
"a_b_c_d_e_f_g_h" => Beide Aufrufe liefern 7
"a_b_c_d_e_f__" => Der erste Aufruf liefert 5, der zweite aber 7 - leere Elemente am Ende werden unterdrückt, wenn man den Aufruf mit einem Parameter macht.

Das mag uninteressant sein, aber ggf. kommt dies aber doch vor. Hier sollte man also ggf. schauen, welches Verhalten Du haben möchtest.

b) Vereinfachung von Aufrufen. Derzeit rufst Du vermutlich mehrfach das split auf. Es reicht aber, dieses einmalig aufzurufen, also etwas wie:
Java:
String[] namensTeile = docname.split("_");
int underlinecount = namensTeile.length - 1;
String fileNameGroup1 = namensTeile[0];
...
 
Nur zur Info damit das nicht untergeht: Man sollte meine in #8 gezeigte Lösung verwenden.
Wenn man den Namen eh in teile zerlegen möchte um die Teile im Weiteren zu verwenden, dann wäre dies schlicht unnötig. Und wenn über Deine Anzahl irgendwas ermittelt wird um darauf basierend auf Array Elemente zuzugreifen, dann wäre es sogar noch fehleranfällig - wie man ja an Hand der Problematik mit den zwei unterschiedlichen split Methoden erkennen kann.
 
Ich kann doch nur auf das Antworten, wonach gefragt wurde... Das Phantasieren überlasse ich anderen.
Man (Ja, nicht Du - das wissen wir Tobias! Deine Probleme mit dem Verständnis einfacher Texte kennt hier ja jeder) kann aber auch auf das ganze Posting eingehen und nicht einfach alles ignorieren, was einem sich nicht sofort erschließt. Und dann findet man in dem ersten Post doch tatsächlich sehr viele Hinweise, dass mit den jeweiligen Teilen etwas gemacht werden könnte.

Daher stimme ich einfach einmal mit ein:
*kopfschüttel*
 
Was willst Du mir sagen? Dass Du keine Argumente hast? Dass Du einfach nichts zum Thema beizutragen hast? Das wussten wir doch schon alle ...
 
Ne dein Verhalten, Konrad 🙂 Versuch bitte nicht etwas Richtiges als falsch darzustellen. Danke.
Wo wurde etwas Richtiges als Falsch dargestellt? Mangelhaftes Textverständnis.

Nirgends wurde behauptet, dass Deine Lösung falsch ist. Es wurde nur schlicht bezweifelt, dass dies die Lösung ist, die wirklich "die Beste" ist. Das sind kleine Unterschiede - aber diese sind durchaus wichtig. Und im Gegensatz zu Dir habe ich mal versucht, etwas zu begründen. Von Dir kommen nur dümmste Bilder und solche Aussagen.
 
Einigen wir uns einfach darauf: Für Dein Verständnis der Problemdomäne.
Und ja - dieses Bild kann man tatsächlich haben - so man vom ersten Post nur den Satz "Ich möchte gerne eine wenn dann Abfrage erstellen, die zuerst auf die Anzahl der Unterstriche prüft." betrachtet. (Ein Wort musste ich zusätzlich streichen ... das stört Dich hoffentlich nicht zu sehr.)

Also ich denke, dass ich Deine Position durchaus verstanden habe. Zu dem ganzen Rest hast Du ja auch klar eine Meinung geäußert: "Das Phantasieren überlasse ich anderen." - was übersetzt schlicht bedeuten dürfte, dass Du Dir über einen möglichen weiteren Sinn in den Aussagen des TEs keine Gedanken machen willst. Das ist auch Dein gutes Recht und das darfst Du so sehen. Zeichnet ein deutliches Bild bezüglich Textverständnis und so ....
 
@adms geht es dir eigentlich um Java oder Javascript?

Java:
var regex = /w[_]{8}/

wäre Javascript. Hier im Forum geht es um Java und auch die Antworten von den anderen beziehen sich auf Java. Manche Sachen funktionieren zufällig auch in Javascript.
 
Regex sind sprach-neutral (und in Java kann man mittels "static" ein Verhalten a la JavaScript simulieren). Und man könnte auf gegebene Mittel des Betriebssystems zugreifen (statt Java(Script), Python,...)
Das es RegEx in beiden gibt und die dann auch gleich funktionieren, ist mir klar. Aber die Schreibweise mit /RegEx/ gibt es so nur in Javascript.

Das zufällig bezog ich darauf, dass man underlinecount = docname.split("_").length - 1; sowohl in Java als auch in JavaScript schreiben kann und es funktioniert. Wohin gegen die Lösung mit den Streams so nur in Java funktioniert.
 
Mag sein, aber deine Lösung funktioniert trotzdem nicht in Javascript und das was der TO im Eingangsposting geschrieben hat, sieht nach Javascript aus.
 

Neue Themen


Zurück
Oben