Zeilenumbruch bei Print# verhindern

  • Sonstige

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    Zeilenumbruch bei Print# verhindern

    Grüße die Herrschaften.

    Folgendes ist das Problem:

    Ein String Constructor erstellt einen output string für die Datei - am ende der akkumulation aller Daten wird in die Datei geschrieben.
    Jeder Schreibvorgang für sich genommen stellt eine Einheit / einen Durchlauf durch die Codesequenz dar - alles in allem noch kein Problem.
    Die Schwierigkeiten beginnen, wenn ich in dem output constructor folgende Zeichenkette habe: "<VbCrLf>" -> Diese resultiert in der Ausgabe in 2 (in worten Zwei) Zeilen anstatt nur einer, da der Steuercode für carriage return und linefeed ausgeführt - aber nicht als text geschrieben wird.

    Nach längerer Suche habe ich artverwandte aber nicht zwingend hilfreiche lösungsvorschläge gefunden die bislang, darauf keinen Einfluss hatten.

    Ideen, Anregungen anyone?

    Mfg
    K.F.
    Hallo Eierlein,

    bedauerlicherweise ist genau diese Option die Apokalypse :) Sie produziert quasi in meinem Code einen ganzen Strang von Text - in welchem <VbCrLf> ebenfalls nicht enthalten ist.
    Ich spezifiziere erneut:
    In der Ausgabe muss der Text "<VbCrLf>" in genau dieser Form in die Datei (.txt) geschrieben werden.
    Das Problem darin besteht, das genau dies nicht geschieht und anstelledessen, ein Zeilenumbruch erzeugt wird.

    Mfg
    k.f.

    Edit.: Zur präzisierung: Das Script öffnet eine Textdatei im txt format und schreibt seine Ausgabe ebenfalls in eine txt Datei.
    Ohne jetzt die Spezifikation von VBA zu kennen: Es müsste eine Möglichkeit geben, das zu escapen. Was passiert, wenn Du \ vor die < und > setzt? Also \<VbCrLf\>.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Hallo Niko,
    danke für die Antwort.

    \ ändert die Ausgabe nicht, das Problem bleibt weiterhin bestehen.

    Mfg
    k.f.


    Eierlein schrieb:

    Zeig
    mal einen Beispieltext oder häng den Text als Datei an.
    Und beschreib' wie der neue Text aussehen soll. (Textbeispiel).


    @Input:

    If Zeile = "<vbCrLf>" Then 'if linebreak, differ between styles of commentary
    If Not commentToken = "'" Then 'linebreak is NOT end of comment

    Output = Output + "\<vbCrLf>" 'try to
    write the code into the file without linebreaking #TODO: THIS NOT
    WORKING
    checkflag = True
    Else
    lineBreak = True 'linebreaking and exiting commentary
    wexit = True 'Versuchsweise exit aus while
    End If
    Else 'Whatever we found is not end of a line
    Output = Output + Zeile
    End If

    @Output: same as input.

    Zur Erklärung:
    Der
    Output der Funktion ist VB Code der in eine txt Datei geschrieben wird.
    Der Input ebenso. Das Steuerzeichen "<vbCrLf>" muss
    ausgeschrieben erhalten bleiben. (seine Funktion also unterbunden
    werden)


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Icognito“ ()

    Hey,
    willkommen im Forum!
    Nutze bitte den VB-Tag (hier klicken)

    Icognito schrieb:

    Zur Erklärung


    Also das dort ein Zeilenumbruch entsteht soll "geschrieben" werden, aber nicht ausgeführt werden?
    Option Strict On!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Drahuverar“ ()

    Hallo Drahuverar,

    ganz genau: Es soll geschrieben werden, das Steuerzeichen. Da der Code für sich genommen nicht ausführbar sein soll / muss / kein codebeispiel ist sondern ein textbeispiel (es handelt sich um ein text verarbeitendes makro) würde ich gern darauf verzichten es als VB code hier reinzuformatieren ^^

    Mfg
    k.f.
    Alles klar, aber trotzdem noch einiges unklar für mich:

    Du hast ein String - genannt Output, nehme ich mal an.
    Das steht dann wohl letzten Endes in deiner txt-Datei, bzw. in der text basierenden Datei.
    Aber was ist "Zeile"? Wo kommt das Ding her, wie wird es gefüttert?
    Fütter uns mit Informationen und wir können dir helfen ;)

    Grüße,
    Drahuverar
    Option Strict On!

    Quellcode

    1. Output = Output + "\<vbCrLf>" 'try to

    Ich dachte da eher an sowas:

    Quellcode

    1. Output = Output + "\<vbCrLf\>" 'try to


    PS:
    Um Code einzufügen, der kein VB-Code ist, kannst Du den Code zwischen [code] und [/code] einschließen. Das ist dann einfach nur ein beliebiger Quellcode und nicht speziell VB-Quellcode (schon mal besser lesbar als gar nicht formatiert). Da das aber anscheinend trotzdem eine Form von Basic-Code ist, würde ich trotzdem empfehlen, es in VB-Code-Tags einzuschließen. Dann stimmt das Syntax-Highlighting auch überein.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

    Drahuverar schrieb:

    Alles klar, aber trotzdem noch einiges unklar für mich:

    Du hast ein String - genannt Output, nehme ich mal an.
    Das steht dann wohl letzten Endes in deiner txt-Datei, bzw. in der text basierenden Datei.
    Aber was ist "Zeile"? Wo kommt das Ding her, wie wird es gefüttert?
    Fütter uns mit Informationen und wir können dir helfen ;)

    Grüße,
    Drahuverar


    Alright

    Was tut das Script zur Gänze: Es nimmt eine Zerhackstückte Codesequenz die in eine txt datei überstellt wurde - liest diese zeilenweise ein.
    jede zeile ist quasi ein wort. (auch syntaktisch)
    diese fügt das script zu "sätzen" im output string zusammen, als string. am ende, wird der string geschrieben.
    dann liest das script zeilenweise weiter und konstruiert den nächsten satz... schreibt diesen... bis zum Ende der Eingabedatei.

    ein "fall" dieses scripts ist, das es vbarchiv.net/faq/faq_strings_vbcrlf.html das Steuerzeichen für zeilenumbruch und linefeed erkennen soll (das geht dann an eierlein - das ding ist eine VBA konstante) und aufgrunddessen den vorgang der zeile abschließt - das tut es auch, funktioniert wunderbärchen, garkein stress. Was allerdings nicht funktioniert ist dieses Zeichen unausgeführt dann auch zu innerhalb eines Strings zu schreiben. Der Ausgabesatz enthält dann also einen Zeilenumbruch mit Linefeed, also zwei Zeilen, statt einer.


    \<...>\ funktioniert genausowenig wie \<...\> (danke Niko, habs versucht grade)


    Gewünschte Ausgabe:

    Visual Basic-Quellcode

    1. if randomVariable = "<vbCrLf>" then


    entsteht also nicht, sondern jene
    Fehlerhafte Ausgabe:

    Visual Basic-Quellcode

    1. if randomVariable = "
    2. " then

    petaod schrieb:

    Icognito schrieb:

    Der Ausgabesatz enthält dann also einen Zeilenumbruch mit Linefeed,
    Womit schaust du dir die Datei an?
    Kannst du mal mit einem Hex-Editor rein schauen und die Hex-Codes der fraglichen Stelle mitteilen.


    alles klar, kein problem:

    22 0D 0A 22 -> ".." ist die repräsentation des zeichens im hex (geöffnet im hex editor, zeichenwerte ausgelesen.)
    wie ich es sonst öffne: im notepad, als auch notepad ++

    mfg
    me
    Ich glaube, das Problem ist wirklich, dass Du den Code nicht in Code-Tags gepackt hast und deshalb keiner wirklich durchgeblickt hat, was der Code macht.
    Hier mal anständig formatiert:

    VB.NET-Quellcode

    1. If Zeile = "<vbCrLf>" Then 'if linebreak, differ between styles of commentary
    2. If Not commentToken = "'" Then 'linebreak is NOT end of comment
    3. Output = Output + "\<vbCrLf>" 'try to write the code into the file without linebreaking #TODO: THIS NOT WORKING
    4. checkflag = True
    5. Else
    6. lineBreak = True 'linebreaking and exiting commentary
    7. wexit = True 'Versuchsweise exit aus while
    8. End If
    9. Else 'Whatever we found is not end of a line
    10. Output = Output + Zeile
    11. End If

    Da sieht man mal, wie wichtig Syntax-Highlighting ist. Ich dachte erst <vbCrLf> wäre eine Art Escape-Sequenz in VBA (wie z.B. \r in C#), deshalb hab ich vorgeschlagen, zu escapen. War wohl eine falsche Annahme.
    Sehe ich das richtig, dass Du mit der ersten Zeile prüfen möchtest, ob "Zeile" ein Zeilenumbruch ist? Das passiert hier nämlich nicht. Du prüfst hier, ob wortwörtlich <vbCrLf> drin steht.
    Wenn Du prüfen möchtest, ob es wirklich ein Zeilenumbruch ist, dann solltest Du folgendes machen:

    VB.NET-Quellcode

    1. If Zeile = vbCrLf Then
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Niko Ortner
    Ganz so einfach scheint es doch nicht zu sein.
    Bin das mal gerade durchgegangen, 3 verschiedene "Bezugsquellen".
    Einmal eine RTB, String und Text Datei.

    Einfach mal ne Form starten mit nem RTB Control und folgendes im Load Event einfügen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. RichTextBox1.Clear()
    2. 'System.Environment
    3. Dim Env_NewLine As String = Environment.NewLine
    4. 'VB carriage return line Feed
    5. Dim VB_Const_CR_LF As String = Microsoft.VisualBasic.Constants.vbCrLf
    6. RichTextBox1.Text = "1" & Env_NewLine &
    7. "2" & Env_NewLine &
    8. "3" & Env_NewLine &
    9. "4"
    10. 'Testen wir's mal in ner RTB
    11. Dim sRTB As String = RichTextBox1.Text
    12. Dim RTB_count As Integer = 0
    13. For Each Env_NewLine In sRTB
    14. RTB_count += 1
    15. Next
    16. MessageBox.Show(RTB_count & " Zeile(n) in der RTB gefunden")
    17. 'Jetzt mal direkt mit 'nem String
    18. Dim sText As String = "1" & Env_NewLine &
    19. "2" & Env_NewLine &
    20. "3" & Env_NewLine &
    21. "4"
    22. Dim STR_count As Integer = 0
    23. For Each Env_NewLine In sText
    24. STR_count += 1
    25. Next
    26. MessageBox.Show(STR_count & " Zeile(n) in dem String gefunden")
    27. 'Und noch von 'ner Text Datei, Inhalt:
    28. '1
    29. '2
    30. '3
    31. '4
    32. Dim srText As String = ""
    33. Using sr As New StreamReader("C:\bla.txt", True)
    34. srText = sr.ReadToEnd()
    35. End Using
    36. Dim SR_Count As Integer = 0
    37. For Each Env_NewLine In srText
    38. SR_Count += 1
    39. Next
    40. MessageBox.Show(SR_Count & " Zeile(n) in der Text Datei gefunden")


    Ganz interessant;
    gehe ich hin und ersetze in dem String sText Env_NewLine mit VB_Const_CR_LF erhalte ich bei der 2. For each "10" und mit VB_Const_CR_LF anstelle der Env_NewLine in dem String, sind es "7".

    Auch ist mir aufgefallen, dass hier nicht nur die Zeilen sondern die Zeichen gezählt werden, weswegen das denn? :whistling: ?(
    Das heißt irgendwo ist es ja richtig, da <CR> und <LF> [(10)(13)] 2 Zeichen sind... Ich muss da auch mal ein bisschen schauen, ist mir so nie aufgefallen.
    Option Strict On!
    Auch ist mir aufgefallen, dass hier nicht nur die Zeilen sondern die Zeichen gezählt werden, weswegen das denn?

    String implementiert IEnumerable(Of Char), ist also eine Auflistung von Zeichen.
    Die For-Each-Schleife iteriert über alle Elemente einer Auflistung.
    Jetzt sollte klar sein, dass die For-Each-Schleife alle Zeichen eines Strings durchläuft.
    Wenn man Zeilen zählen will, ist es nicht ganz so einfach. Hat man nur einen String, dann muss man manuell splitten:

    VB.NET-Quellcode

    1. Dim A = "Hallo" & Environment.NewLine & "Welt"
    2. Dim B1 = A.Split({Environment.NewLine}, StringSplitOptions.None) 'Splittet an allen Vorkommen von Environment.NewLine, was im Normalfall ein CR-Zeichen und ein LF-Zeichen ist.
    3. Dim B2 = A.Split(ControlChars.Lf) 'Splittet an allen Vorkommen von einem LF-Zeichen. Beachte, dass das erste Element im zurückgegebenen Array noch ein CR-Zeichen am Ende hat, denn daran wurde ja nicht gesplittet.

    Wenn man eine Datei hat und den Inhalt zeilenweise möchte, geht das relativ einfach: File.ReadAllLines(Pfad, Encoding). Ob hier nur CR gefolgt von LF, oder auch LF alleine als Zeilenumbruch erkannt wird weiß ich nicht.
    TextBoxen (und RichTextBoxen glaub ich auch) haben eine Lines-Property, mit der man die Zeilen abfragen kann. Aber beachte: Es kann sein, dass hier auch bei "soft linebreaks" mehr Zeilen raus kommen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Ich glaube, das Problem ist wirklich, dass Du den Code nicht in Code-Tags gepackt hast und deshalb keiner wirklich durchgeblickt hat, was der Code macht.
    Hier mal anständig formatiert:

    VB.NET-Quellcode

    1. If Zeile = "<vbCrLf>" Then 'if linebreak, differ between styles of commentary
    2. If Not commentToken = "'" Then 'linebreak is NOT end of comment
    3. Output = Output + "\<vbCrLf>" 'try to write the code into the file without linebreaking #TODO: THIS NOT WORKING
    4. checkflag = True
    5. Else
    6. lineBreak = True 'linebreaking and exiting commentary
    7. wexit = True 'Versuchsweise exit aus while
    8. End If
    9. Else 'Whatever we found is not end of a line
    10. Output = Output + Zeile
    11. End If

    Da sieht man mal, wie wichtig Syntax-Highlighting ist. Ich dachte erst <vbCrLf> wäre eine Art Escape-Sequenz in VBA (wie z.B. \r in C#), deshalb hab ich vorgeschlagen, zu escapen. War wohl eine falsche Annahme.
    Sehe ich das richtig, dass Du mit der ersten Zeile prüfen möchtest, ob "Zeile" ein Zeilenumbruch ist? Das passiert hier nämlich nicht. Du prüfst hier, ob wortwörtlich <vbCrLf> drin steht.
    Wenn Du prüfen möchtest, ob es wirklich ein Zeilenumbruch ist, dann solltest Du folgendes machen:

    VB.NET-Quellcode

    1. If Zeile = vbCrLf Then


    Hey Niko,

    zur Erläuterung warum deine Annahme so nicht ganz stimmt:
    Jede Zeile ist ein Wort. Diesbezüglich ist am Ende jeder "Zeile" ein Zeilenumbruch, von dem kann "automatisch" ausgegangen werden in der eingehenden Datei und der wird auch so nicht abgefangen. Auch <vbCrLf> steht im Klartext drin, kann also auch so "gelesen" werden als Text und ist damit ein Signal, jenen "Text" in den Stringkonstruktor einzubauen.
    Vielen Dank dennoch ersteinmal für all die Hilfe, ich muss gestehen das ich eine Weile gebraucht habe durch den folgenden Rest durchzusteigen aber soweit bin ich gekommen...: Es gibt noch keine Lösung dafür, right? ^^
    Ich werde jetzt einfach mal versuchen in einem völlig anderen Projekt Code zu erstellen der nix anderes tun soll als das <vbCrLf> in eine Datei zu schrieben und schau mal wie das wirkt.
    experimentomode on! :)

    mfg
    me