Textdatei bearbeiten

  • VB.NET

Es gibt 44 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Guten Abend,

    vielen Dank "Thias" und vielen Dank "rdmguy" das ihr euch entschlossen habt mir zu helfen.

    Leider hat er nun zwar den Befehl wie von "Thias" aufgezeigt angenommen (gestern zwar nicht, aber vielleicht lag es auch an mir) jedoch hat dieser leider keine Änderung bewirkt.

    Mit dem RemoveAt Befehl wie von "rdmguy" vorgeschlagen hat es nun auf Anhieb geklappt.

    Vielen Dank euch beiden.
    Hallo da bin ich nochmal,

    habe nun folgendes Problem:

    VB.NET-Quellcode

    1. Public Class Form1
    2. 'ERKLÄRUNG: Die hier außerhalb der Public Sub definierten Variablen sind von jeder Sub bzw. aus jedem
    3. ' Programmteil erreichbar. Variablen innerhalb eines Sub's sind z.B. nach beenden einer IF
    4. ' Schleife nicht mehr erreichbar.
    5. Dim DateiAusgewählt As String = "Keine Datei ausgewählt"
    6. Dim fileaslist As New List(Of String)
    7. Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Durchsuchen_Knopf.Click


    Hier folgt nun die Anweisung was nun passiert nach dem Drücken des knopfe = Mein eigentliches Programm

    Nun habe ich an einer weiteren Stelle die Möglichkeit durch einen Klick den selben Effekt hervorzurufen wie in der "Public Sub Button1_Click" und zwar hier:

    VB.NET-Quellcode

    1. Private Sub DateiÖffnenToolStripMenuItem_Click_1(sender As Object, e As EventArgs) Handles DateiÖffnenToolStripMenuItem.Click


    Diese befindet sich in der selben Klasse also "Public Class Form1".

    Wie kann ich nun sagen das er einfach das machen soll wie in der:

    VB.NET-Quellcode

    1. Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Durchsuchen_Knopf.Click


    beschrieben?

    Klar ich könnte den Code 1zu1 einfach in diese Sub kopieren, das erscheint mir aber etwas komisch denn dann würde mein Programm ja sinnlos um den selben
    inhalt vergrößert.

    Es muss doch möglich sein zu sagen er soll einfach das selbe machen wie er bei "Public Sub Button1_Click" machen würde???
    da gibts 2 Möglichkeiten:
    1. Button1.PerformClick() - simuliert tatsächlich einen Button-Klick
    2. Schreib eine Extra-Sub, und verlager allen Code von Button1_Click da hinein. Diese Methode kannste nun sowohl von Button1_Click als auch von DateiÖffnenToolStripMenuItem_Click_1 aus aufrufen
    3. Erweiter die Handles-Klausel von Button1_Click

      VB.NET-Quellcode

      1. Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Durchsuchen_Knopf.Click, DateiÖffnenToolStripMenuItem.Click

    Architektonisch vorzuziehen ist 2), denn 1) ist bisserl quick & dirty, während 3) bisserl sophisticated ist.
    Hallo ich bin nun einiges weiter, aber das verursacht wieder einige Probleme.

    Auf der ersten Seite hier habe ich ja abgebildet wie in etwa der Textinhalt der verarbeitet wird lautet.

    Als erstes lade ich das Programm in eine Textbox. Im zwiten Schritt wird per Button der Text in eine Zeit Textbox geladen unter gewissen Ausschlußkriterien. Es werden z.B. Alle Sätze weg gelassen welche in Klammern stehen.

    Soweit so gut. Aber nun stimmt ja die Reihenfolge "N1" "N2" usw. nicht mehr.

    Kann ich einem String sagen das es das erste Wort weg lassen bzw. Ersetzen soll?

    Das Problem vor dem ich stehe ist das ich ja nicht sagen kann um welches Wort komplett es sich handelt. Sprich "N10" oder "N100"...Die Sätze müssen ja komplett in Reihenfolge durch nummeriert werden. Ich weiß weder mit welchem "N..." es Anfänge noch ob die Reihenfolge unterbrochen wird also das z.B. Nach "N101" "N208" kommt als Beispiel.

    Habt ihr hier mal wieder einen Tipp für mich?
    tja, ich könnte schon eine Methode schreiben, die Einträge einer List(Of String) neu durchnumeriert.

    Aber du könntest glaub kaum damit umgehen - du lädtst ja das Programm in Textboxen.
    Mit Textboxen mach ich aber keine String-Verarbeitung.
    Textboxen sind zum Anzeigen von Text da, für den User.

    String-Verarbeitung macht man in List(Of String).
    Ja du hattest mir doch die "List Of Steing" statt dem Array empfohlen wenn ich mich nicht irre!?

    Und ich habe über List of Sting die Datei eingelesen. Und zeige sie in der ListeBox an.

    Nun gibt es einen Button der der an dieser Liste eine Änderung vornimmt. Und diese in einer 2. Listbox anzeigt. Die Listbox möchte ich haben damit im nächste Schritt der Benutzer das Programm zum einen sehen kann und zum anderen darin auch noch Änderungen vorgenommen kann!!

    sllem schrieb:

    Die Listbox möchte ich haben damit im nächste Schritt der Benutzer das Programm zum einen sehen kann und zum anderen darin auch noch Änderungen vorgenommen kann!!

    Merken - wichtig!:
    Das Programm nimmt keine Änderungen in der Listbox vor!
    Keine Controls ändern - immer Daten ändern!!
    Das Programm kann eine List(Of String) ändern - bitte keine Listbox ändern!!!
    Merken das!!!!


    gut - und dann zeig mal eine Liste der Strings - aber eine realistische Liste.

    Weil was in post#1 steht ist sicherlich nicht so eine Liste.
    Ok Erfinder,

    du machst es mir nicht einfach dafür hast du aber das Wissen auf welches ich zugreifen möchte. Leider verstehe ich nicht immer was du genau an Vorleistung möchtest aber ich versuche dir zu Zeigen was ich habe:

    Hier meine List of String

    VB.NET-Quellcode

    1. Dim fileaslist As New List(Of String)


    Nun wählt man eine Datei (welche einem CNC Programm entspricht mit welcher man Metall berarebitet aus):

    VB.NET-Quellcode

    1. Public Sub DateiÖffnenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DateiÖffnenToolStripMenuItem.Click
    2. If OpenFileDialog1.ShowDialog = DialogResult.OK Then
    3. Else
    4. MessageBox.Show("Es wurde keine Datei ausgewählt.")
    5. Return
    6. End If
    7. ToolStripStatusLabel2.Text = OpenFileDialog1.FileName
    8. fileaslist.AddRange(IO.File.ReadAllLines(OpenFileDialog1.FileName))
    9. 'Dim DateiInhalt As String
    10. For Each DateiInhalt In fileaslist
    11. 'Console.WriteLine(DateiInhalt)
    12. lbProgramminhaltOriginal.Items.Add(DateiInhalt)
    13. Next
    14. MessageBox.Show("Das Programm wurde erfolgreich mit " & fileaslist.Count & " Sätze eingelesen.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
    15. End Sub


    Der inhalt der List Of String wird dann in der 1. Listbox angezeigt.

    In etwa könnte der Inhalt so aussehen:


    Spoiler anzeigen
    N1 (05/13/16 10:28:56)
    N2 (Datei mit korrigierter Fräsermittelpunktsbahn)
    N3 (Wz-Durchmesser = 10.000)
    N4 (Aufmass = 0.000)
    N5 (Kompensation links)
    N6 (Sicherheitshöhe Z,absolut = 100.000)
    N7 (Annäherungsdistanz,inkremental = 0.000)
    N8 (Annäherungsvorschub = 300)
    N9 (Arbeitsvorschub = 300)
    N10 (Spindeldrehzahl = 3600)
    N11 M03 S3600
    N12 F300
    N13 G00 Z100.000
    N14 G00 X0.536 Y8.536 Z100.000
    N15 G00 X0.536 Y8.536 Z0.000
    N16 X0.536 Y3.536 Z0.000
    N17 X3.536 Y0.536 Z0.000
    N18 X3.865 Y0.172 Z0.000
    N19 X4.157 Y-0.222 Z0.000
    N20 X4.410 Y-0.643 Z0.000
    N21 X4.619 Y-1.087 Z0.000
    N22 X4.785 Y-1.549 Z0.000
    N23 X4.904 Y-2.025 Z0.000
    N24 X4.976 Y-2.510 Z0.000
    N25 X5.000 Y-3.000 Z0.000
    N26 X5.000 Y-59.400 Z0.000
    N27 X4.976 Y-59.890 Z0.000
    uws.


    Nun nimmt man z.B. durch das drücken eines Knopfes an diesem Inhalt änderungen vor (z.B. löscht man sätze raus die in Klammern stehen, oder man fügt einen neuen Satz hinzu) Beipsiel:

    Spoiler anzeigen
    N11 M03 S3600
    N12 F300
    N13 G00 Z100.000
    N14 G00 X0.536 Y8.536 Z100.000
    N15 G00 X0.536 Y8.536 Z0.000
    N16 X0.536 Y3.536 Z0.000
    N17 X3.536 Y0.536 Z0.000

    N18 X3.865 Y0.172 Z0.000
    N19 X4.157 Y-0.222 Z0.000
    N20 X4.410 Y-0.643 Z0.000
    N21 X4.619 Y-1.087 Z0.000
    N22 X4.785 Y-1.549 Z0.000
    N23 X4.904 Y-2.025 Z0.000


    Nun beginnen die Sätze leider mit N12 statt mit N1 und zwischen N17 und N18 wurde eine neue Zeile hinzugefügt.

    Was ich nun erreichen müsste das die Nummerierung N1 N2 usw. fortlaufend ist, entweder immer direkt sobald eine änderung vorgenommen wird, oder zum abschluss wenn man es speichert.

    Deshalb meine Frage (da jeder Satz mit einem "N" gefolgt von einer Zahl anfängt) ob es möglich ist in der List Of String gezielt das 1. WORT an zu sprechen?

    Ich weiß ja nicht ob es N12 oder N150 oder N2 ist!?

    Hoffe das war jetzt so weit ganz gut erklärt?

    sllem schrieb:

    Nummerierung N1 N2 usw. fortlaufend
    Da gibt es mindestens zwei Möglichkeiten:
    1. Du numerierst die Zeilen beim Editieren neu, wenn sich Zeilen / Zeilennummern ändern.
      Dazu musst Du die Zeilen am 1. Leerzeichen splitten und die richtige Nummer einsetzen.
    2. Du speicherst die Zeilennummern-Info nicht mit ab, sondern fügst sie erst dann automatisch hinzu, wenn die Daten an die Maschine übertragen werden,
    Wann genau werden die Zeilennummern tatsächlich benötigt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke ROD,

    Gibt es denn ein Befehl damit er am Leerzeichen abschneidet?

    Ich könnte ja schon beim einlesen der Datei den vorderen Bereich weg lassen!?

    Im Prinzip wird die Datei nach dem bearbeiten mit meinem Programm am Ende vom Bediener gespeichert. Es würde reichen die neue Nummerierung erst dann hinzuzufügen. Es wäre für den Benutzer aber auch schön wenn er in der 2. Listbox (vor dem speichern) die richtige Nummerierung sehen könnte. Das würde mehr Übersicht bringen und wäre fachlich korrekter!

    Bei der Übertragung an die Maschine wäre zu spät. Da der Bediener die Datei eh speichern muss und nicht direkt überträgt wäre es spätestens beim speichern notwendig.

    sllem schrieb:

    Befehl
    z.B. so:

    VB.NET-Quellcode

    1. Dim txt = "N1 (05/13/16 10:28:56)"
    2. Dim txt2 = txt.Split(New Char() {" "c}, 2) ' genau am 1. leerzeichen splitten und sonst nix
    3. MessageBox.Show(txt2(1))
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    sllem schrieb:

    der von dir gezeigte Mechanismus ist quasi manuell, ich muss dies nun automatisieren das er nach und nach Satz für Satz in die Variable "txt" schreibt und diesen abschneidet,
    oder muss ich den aus der List Of String schneiden und dabei direkt eine neue List Of String erstellen?

    RodFromGermany schrieb:

    VB-Fragen über PN / Konversation werden ignoriert!

    Klar, ich habe Dir lediglich gezeigt, wie Du mit einer Zeile umgehen musst, um Dein Ziel zu erreichen.
    Automatisieren solltest Du das allein, zumindest versuchen. Natürlich bekommst Du Hilfe, wenn es klemmt. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank nochmal RodFromGermany, leider komme ich herst heute wieder zu meinem Projekt,

    Das mit dem Spliz bis zum 1. Leerzeichen funktioniert PERFEKT. Aber woher bekomme ich diese Befehle?

    Z.b. um ab zu fragen ob der erste Buchstabe ein "N" ist, und so weiter. Gibt es da ein Übersicht?

    Damit könnte man wirklich geniale Sachen machen.
    Egal wie ich den Code aufsetze es klappt einfach nicht,

    entweder gibt er mir statt dem Inhalt einfach nur "String[]-Arry" aus oder Bricht mit einer Fehlermeldung ab "Ein Ausnahmefehler des Typs "System.ArgumentOutOfRangeException" ist in mscorlib.dll aufgetreten.".

    VB.NET-Quellcode

    1. Private Sub bNummerieren_Click(sender As Object, e As EventArgs) Handles bNummerieren.Click
    2. For Each DateiInhalt In fileaslist
    3. Console.WriteLine(DateiInhalt)
    4. If (DateiInhalt.Substring(0, 1) = "N") Then
    5. DateiInhalt.Split(New Char() {" "c}, 2)
    6. MsgBox(DateiInhalt)
    7. lbProgrammUmgewandelt.Items.Add(DateiInhalt)
    8. ElseIf Not (DateiInhalt.Substring(0, 1) = "N") Then
    9. lbProgrammUmgewandelt.Items.Add(DateiInhalt)
    10. End If
    11. Next


    Aber er splittet es einfach nicht. :cursing:

    Und wenn ich es so mache:

    VB.NET-Quellcode

    1. Private Sub bNummerieren_Click(sender As Object, e As EventArgs) Handles bNummerieren.Click
    2. For Each DateiInhalt In fileaslist
    3. Console.WriteLine(DateiInhalt)
    4. If (DateiInhalt.Substring(0, 1) = "N") Then
    5. Dim NeuerDateiInhalt = DateiInhalt.Split(New Char() {" "c}, 2)
    6. MsgBox(NeuerDateiInhalt(1))
    7. lbProgrammUmgewandelt.Items.Add(NeuerDateiInhalt)
    8. ElseIf Not (DateiInhalt.Substring(0, 1) = "N") Then
    9. lbProgrammUmgewandelt.Items.Add(DateiInhalt)
    10. End If
    11. Next


    Dann splittet er es zwar, aber bricht auch sofort wieder ab. Mit "Ein Ausnahmefehler des Typs "System.ArgumentOutOfRangeException" ist in mscorlib.dll aufgetreten."



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

    @sllem Welchen Rückgabewert hat Split :?: 8o :thumbsup:
    Du kannst auch schreiben:

    VB.NET-Quellcode

    1. If (DateiInhalt.StartsWith("N")) Then
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Juhu, er ist wieder da!!!!!

    Ähm, wie meinst du das? Der inhalt ist ein String.

    Also das passiert wenn ich es laufen lasse......
    Bilder
    • VBnetProblem.jpg

      293,65 kB, 1.920×1.080, 74 mal angesehen

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

    sllem schrieb:

    Der inhalt ist ein String.
    Nö.
    Ein String-Array.
    Und:
    Nutze die Datei-Anhang-Funktion des Forums: Erweiterte Antwort -> Dateianhänge -> Hochladen.
    Editiere bitte Deinen letzten Post.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok, habe ich jetzt....macht er aber nicht:

    VB.NET-Quellcode

    1. Private Sub bNummerieren_Click(sender As Object, e As EventArgs) Handles bNummerieren.Click
    2. For Each DateiInhalt In fileaslist
    3. Console.WriteLine(DateiInhalt)
    4. If (DateiInhalt.StartsWith("N")) Then
    5. DateiInhalt.Split(New Char() {" "c}, 2)
    6. MsgBox(DateiInhalt)
    7. lbProgrammUmgewandelt.Items.Add(DateiInhalt)
    8. ElseIf Not (DateiInhalt.StartsWith("N")) Then
    9. lbProgrammUmgewandelt.Items.Add(DateiInhalt)
    10. End If
    11. Next
    Bilder
    • VBnetProblem2.jpg

      331,81 kB, 1.920×1.080, 70 mal angesehen