Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo Leute,
Wie kann man aus einem String Leerzeilen entfernen.
Mein Versuch:
String data; //Enthält ein Text mit überflüssigen Leerzeilen
String temp=new String(data.replaceAll("\r+","\r"); //also "+" steht für mehrere
// wenn ich richtig verstehe
hab gegoogelt aber nichts gefunden..Hat jemand eine Idee wie man es lösen kann?
Danke Robat für deine Antworten. trim() reicht nicht ,weil text hat mitten drin überflüssigen Leerzeilen.
Zweite Lösung hab grade ausprobiert hat nichts geändert.
@MoxxiManagarm Würde die Variante nicht auch dann fehlschlagen, wenn die Datei auf nem UNIX (bspw) erstellt wurde und das Programm auf nem Windows ausgeführt wird? Daher noch mal die "händische" Variante
)).Entschuldigung Robat.Die zweite Lösung von dir hate im laufendem Programm ausprobiert. Nach dem Neustart gings alles ..aber jetzt ist der ganze Text eine Zeile))
@MoxxiManagarm Würde die Variante nicht auch dann fehlschlagen, wenn die Datei auf nem UNIX (bspw) erstellt wurde und das Programm auf nem Windows ausgeführt wird? Daher noch mal die "händische" Variante
Das hattest du bisher aber nicht erwähnt Du willst also einzelne Zeilenumbrüche stehen lassen und nur mehrere, aufeinanderfolgende Zeilenumbrüche löschen?
\r ist kein Zeilenumbruch, sondern ein "Wagenrücklauf".
Unter Unixoiden ist das kein Teil des Zeilenumbruchs (dort ist es \n) und unter Windows nur die Hälfte (dort ist es \r\n), in beiden Fällen würden also der eigentlichen Zeilenumbrüche und damit auch die Leerzeilen bleiben.
Unter Windows \n steht für Leerzeichen.Eine Leerzeile muss nicht unbedingt ein Leerzeichen enthalten also wenns \r\r
dann ist dass auch eine Leerzeile.Für mein Programm hat die Lösung gereicht,aber ich universilisiere)) es gleich.
Unter Windows \n steht für Leerzeichen.Eine Leerzeile muss nicht unbedingt ein Leerzeichen enthalten also wenns \r\r
dann ist dass auch eine Leerzeile.Für mein Programm hat die Lösung gereicht,aber ich universilisiere)) es gleich.
Unter Windows wird ein Zeilenumbruch mit "\r\n" abgebildet, unter Unix mit "\n".
Wenn du aus deinem Text unter Windows alle '\r' entfernst, mag das in manchen Programmen nicht mehr nach einer Leerzeile aussehen, es sind aber weiterhin alle '\n' enthalten, und viele andere Programme werden das auch weiterhin als Leerzeile anzeigen.
So ist dann am Besten,weil alle Möglichkeiten ,die vorkommen können,kann man nicht aussortieren.
Es könnte ja zwischen line.Separatoren Leerzeichen,Tabulator,Zeilenvorschub in verschiedenen Kombinationen und Anzahl stehen.
So ist dann am Besten,weil alle Möglichkeiten ,die vorkommen können,kann man nicht aussortieren.
Es könnte ja zwischen line.Separatoren Leerzeichen,Tabulator,Zeilenvorschub in verschiedenen Kombinationen und Anzahl stehen.
In meinem Programm hat mir die letzte Lösung gereicht ,weil ich selbst aus dem Programm Kommentare entfernt habe und ich weiß ,dass da nichts dazwischen steht.Ich sollte die Leerzeilen entfernen nur um die Anzahl an Codezeilen zu rauskriegen
Dann ist die Frage wie viele Möglichkeiten gibt es denn, wenn aber in Leerzeilen etwas bleibt ..Wir haben 3 Zeichen \n ,\s, ' ' die dazwischen stehen können
könnte sein dass Leerzeile so was enthält:-' '\n' '\s\n' ' zmb.
Entschuldigung Leute wenn ich jemandem auf die Nerven gehe aber ich brauche wirklich Hilfe.
Seit einer Woche sitze ich mit diesem String und werde deswegen bald gefeuert,wenns weiter so bleibt.
alle oben genante Lösungen haben funktioniert bei allen zum Test gemachten Strings,nur nicht bei dem Programm.
Ich habe einen MDWZ1020.txt (enthält SAS-Programm) File der in einen String data eingelesen wird:
ADD NAME=MDWZ1020
/* MDWZ1020_SAS______SOURCE___SASMACRO_XXXX_2017-10-16-13.34.16. */
/* 000000_5_0103 */
/******************************************************************/
/* [?PROGNAME MDWZ1020?] */
/* [?PROGTYPE MACRO?] */
/* [?PROGCAT MAPPING?] */
/* [?PROJECT Umstellung Mercator-Mappings auf SAS?] */
/* [?AUTHOR xxxxxxxx?] */
/* [?CREATED 28.08.2003?] */
/* [?LASTCHG 16.10.2017?] */
/* [?PROGDESC Erstellung der Tabelle beziehungsarten durch */
/* Sortierung der Tabelle pilot.bezarten?] */
/* [?INPUT pilot.bezarten?] */
/* [?OUTPUT beziehungsarten?] */
/* [?EXECUTION Job: xxxxx Mapping: xxxx] */
/* [?CHGHIST */
/* 07.11.2016 | MD | Migration nach Unix */
/* 16.10.2017 | RG | Inline-Dokumentation eingefuegt?] */
/******************************************************************/
/* [?STEP1?] */
/* [?STEPTYPE PROC SORT?] */
/* [?STEPDESC Sortieren von pilot.bezarten nach personen und */
/* Ausgabe als beziehungsarten?] */
PROC SORT DATA = &inlib..bezarten(KEEP = ckontoid
cpersnr
personen
rollenar
rolle
klammer
textpart
kontonr
aufldat
beziehun)
OUT = &ds_name;
BY personen;
RUN;
/* [?ENDSTEP?] */
%MEND;
Im Programm mache ich Methoden Aufruf um die Kommentare zu Entfernen.
Java:
data=Analyse.EntferneKommentar(data);
Die Methode EntferneKommentar() sieht so aus:
Java:
public static String EntferneKommentar(String text){
final String flagKomAnf=new String("/*");
final String flagKomEnd=new String("*/");
String temp=new String("");
for (int i=0;i<text.length()-2;i++){
temp=text.substring(i, i+2);
if(temp.equals(flagKomAnf)){
text=text.substring(0,text.indexOf(temp)).concat(text.substring(text.indexOf(flagKomEnd, text.indexOf(temp))+2,text.length()));
}
}
if (System.getProperty("line.separator").equals("\r\n")){
text.replace("[\r\n]{2,}","");
}
if(System.getProperty("line.separator").equals("\n")){
text.replace("[\n]{2,}","");
}
return text;
}
Die Kommentare werden entfernt aber die Leerzeilen bleiben da,egal was ich mache.
Ausgabe String sieht so aus bei mir:
ADD NAME=MDWZ1020
PROC SORT DATA = &inlib..bezarten(KEEP = ckontoid
cpersnr
personen
rollenar
rolle
klammer
textpart
kontonr
aufldat
beziehun)
OUT = &ds_name;
BY personen;
RUN;
%MEND
Hat jemand Ahnung wo mein Fehler ist?
Danke im Voraus.
Dein Problem: Strings sind immutable und replace(All) verlangt, dass man auch den return-value berücksichtigt. Desweiteren wäre Regex genau das richtige, wobei ich einen Parser bevorzugen würde!
Setz den Beispiel-Text auch in Code-Tags, der verliert sonst z.T. seine Formatierung
Du solltest an der Stelle nicht mit line.separator arbeiten (und wenn nutz System.lineSeparator()), irgendwann gibt das garantiert Probleme, sondern immer mit "\r\n" und "\n" arbeiten.
Die Variante von @Flown funktioniert problemlos, wenn du noch Probleme hast, solltest du einmal den ganzen aktuellen Code zeigen.
ein winziger Fehler ist noch in der Lösung von Flown:
Java:
public class Test {
public static void main(String[] args) {
String in = "Das ist /* k1 */ kein /* k2 */ Mist";
String comment = in.replaceAll("/\\*.*\\*/", "");
System.out.println(comment);
}
}
Jetzt ist es so wie man es braucht.
Waren tatsächlich Leerzeichen zwischen Zeilenumbrüchen
Danke an alle Beteiligten,ohne eure Hilfe wäre ich gefeuert)