Textdatei bearbeiten

  • VB.NET

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

    Textdatei bearbeiten

    Hallo alle Miteinander,

    Ich bin ein totaler Visual Basic.NET noob. Ich habe hier 2 Bücher durch welche ich mich versuche zu belesen (möchte jetzt keine Werbung machen). :)

    Ich habe vor folgende Aufgebe zu bewältigen und leider im Netz oder Buch keine genau zutreffende Antwort gefunden:

    Ich möchte in mein Programm eine Textdatei einlesen (diese hat nicht zwingend die Endung ".txt" jedoch ist der Inhalt immer ASCII)

    Jeder dieser Zeilen beginnt mit einem "N1" "N2" "N3" usw....

    Dahinter stehen verschiedene Koordinaten (für eine CNC Maschine).

    Beiapiel:

    N3 G01 Z100 Y-5

    Nun möchte ich im ersten Schritt am Anfang der Textdatei automatisch 4 Zeilen einfügen. Diese müssen dann wieder mit "N1" usw. beginnen. Im zweiten Schritt möchte ich Sätze die ein "(" enthalten komplett aus der Datei löschen und nun im 3. Schritt möchte ich die Zeilen neu benennen, Sprich: Die Zeilen wieder fortlaufend mit"

    N1
    N2
    N3

    Usw Nummerieren! Natürlich stehen in jeder Zeile auch noch weitere Texte wie oben im Beispiel aufgezeigt.

    Ich bin aktuell überzeugt das ich dies irgendwie die über Stream.Read und Stream.write lösen kann...Jedoch finde ich kein tutorial oder ähnliches welche sich meinem Problem annehmen.

    Hat jemand von euch einen Link oder Tipp für mich wo ich so etwas nachlesen oder als Muster zum umprogrammieren her bekommen kann?

    Vielen Dank für seine Hilfe.

    Mfg
    SLLEM
    Willkommen im Forum. :thumbup:

    sllem schrieb:

    Visual Basic.NET noob

    sllem schrieb:

    irgendwie die über Stream.Read und Stream.write lösen
    Wenn Du keinen Plan hast, wäre es besser, kein Richtung vorzugeben, da sonst einige Helfer genau auf der vorgegebenen Schiene eine suboptimale Lösung posten.
    1. Trenne Daten und GUI.
      Wenn Du Textdaten bearbeiten willst, hat das nicht notwendiger weise was mit der Anzeige zu tun.
    2. Wenn die Dateizeilenbasiert ist, lies die Zeilen in ein String-Array ein, bearbeite dieses Array, zeige es an und speichere es ab, dazu gibt es mächtige .NET-Funktionen:

      VB.NET-Quellcode

      1. System.IO.File.ReadAllLines(...)
      2. TextBox1.Lines = ...
      3. System.IO.File.WriteAllLines(...)
    3. Wenn Du irgendwo einzelne Zeilen einfügen oder löschen willst, pack die Zeilen in eine List(Of String) und tue, was getan werden muss.
      Zwischen String-Array und List(Of String) kannst Du elegant hin- und herswitchen mit .ToArray bzw. .ToList.

    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!
    Hey vielen lieben Dank,

    Erst einmal für deine Belehrung welcher ich dir im Nachhinein völlig zustimme und dann noch für deine (schnelle) Antwort.

    Werde mal die Bücher und das Internet nach diesen Befehlen wälzen!!

    Falls jemand einen Link kennt wo ich vielleicht genau dieses Anwendungsbeispiel finde wäre ich natürlich auch sehr dankbar.

    Mfg
    SLLEM

    sllem schrieb:

    einen Link kennt wo ich vielleicht genau dieses Anwendungsbeispiel finde
    Lernresistent? ;)
    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:

    Handwerker
    OK.
    Das sind allerdings Elementarfeatures, die Du Dir einzeln erschließen kannst und danach zusammenbaust.
    Tipp einfach bei Google MSDN ReadAllLines usw. ein, da findest Du die Beschreibung und Beispiele dazu.
    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:

    Ich tue mir einfacher zu verstehen was/warum passiert wenn ich ein Beispiel habe das ich durch kleine Veränderungen begreife!
    Jo, halte ich auch für eine überaus effektive Lernmethode.
    Nur ist mir noch nicht klar, für was genau du ein Beispiel benötigst.
    Also wenn du ein Beispiel zur Ansteuerung von CNC-Maschinen verlangst, wirst du wohl kaum bedient werden können, das ist dir wohl auch klar.

    Ich könnte dir auch gschwind eine Methode hinhauen, die 4 Zeilen in eine TextDatei schreibt, aber immer wenn ich sowas gemacht habe, kam die Rückfrage "und wo muss ich das jetzt einfügen?".

    Daher schreib du die Methode, ich kann dann was darin einfügen.
    So lernst du auch programmieren, denn als erstes - wirst du feststellen - muss man konzipieren, etwa in der Art:

    TextDatei schreiben schön und gut - aber sag mir: Wo soll der Name der TextDatei herkommen?
    Ok, ok.

    Also momentan sieht mein "gehackfleischtes" Programm so aus.

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Windows.Forms
    3. Public Class Form1
    4. Dim DateiAusgewählt As String = "Keine Datei ausgewählt"
    5. Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Durchsuchen_Knopf.Click
    6. If OpenFileDialog1.ShowDialog = DialogResult.OK Then
    7. Label1.Text = OpenFileDialog1.FileName
    8. ListBox1.Items.AddRange(IO.File.ReadAllLines(OpenFileDialog1.FileName))
    9. End If
    10. Dim Pat As String = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), OpenFileDialog1.FileName)
    11. LabelZeilenAnzahl.Text = CStr(System.IO.File.ReadAllLines(Pat).Count)
    12. Console.WriteLine(System.IO.File.ReadAllLines(Pat).Count)
    13. Console.ReadLine()
    14. MessageBox.Show("Das Programm wurde erfolgreich mit " & CStr(System.IO.File.ReadAllLines(Pat).Count) & " Sätzen eingelesen.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
    15. Dim lines() As String = (IO.File.ReadAllLines(OpenFileDialog1.FileName))
    16. Dim lineArray As New ArrayList()
    17. For x As Integer = 0 To lines.GetUpperBound(0)
    18. lineArray.Add(lines(x))
    19. Next
    20. Dim SavePath As String = "C:\TestText\Gespeichert.txt"
    21. For x = 0 To lineArray.Count - 1
    22. ListBox2.Items.Add(lineArray(x))
    23. If lineArray(x).Contains("1433") = True Then MsgBox("Satz gefunden in Array Nummer " & x & " ")
    24. Next
    25. For x = 0 To lineArray.Count - 1
    26. Dim file As System.IO.StreamWriter
    27. file = My.Computer.FileSystem.OpenTextFileWriter("c:\TestText\Gespeichert.txt", True)
    28. file.WriteLine(lineArray(x))
    29. file.Close()
    30. Dim GespeicherteDatei As String = "c:\TestText\Gespeichert.txt"
    31. ListBox3.Items.AddRange(IO.File.ReadAllLines(GespeicherteDatei))
    32. Next
    33. End Sub



    In der Zeile "If lineArray(x).Contains("1433") = True Then MsgBox("Satz gefunden in Array Nummer " & x & " ")"

    Hätte ich gerne das er mir vor dem abspeichern der Datei die komplette Zeile mit dem gefundnen "1433" aus dem Array schmeißt und die verbleibenden Zeilen aufrücken!!??

    P.s.: Die Textboxen dienen nur zur Kontrolle damit ich sehe was passiert ist.

    Vielen Dank.
    naja, einen Eintrag an einem bestimmten Index entfernt man mit der Auflistung.RemoveAt(index) - Methode.

    VB.NET-Quellcode

    1. dim toDelete=-1
    2. For x = 0 To lineArray.Count - 1
    3. ListBox2.Items.Add(lineArray(x))
    4. If lineArray(x).Contains("1433")Then
    5. MsgBox("Satz gefunden in Array Nummer " & x & " ")
    6. toDelete = x
    7. end if
    8. Next
    9. if toDelete>=0 then lineArray.RemoveAt(toDelete)

    Ansonsten - wenn du proggen lernen willst - das wichtigste, was du nun tun solltest ist, deine Vb.net-Grundeinstellungen zu korrigieren.

    Mit Option Strict Off und dem Microsoft.VisualBasic-Namespace kann man nicht lernen, Datentypen zu respektieren - das ist aber ganz ganz wesentlich.
    Also Visual Studio - Empfohlene Einstellungen befolgen, egal, ob du's verstehst oder nicht.
    Weil da beisst sich KatzeSchwanz: Datentypen lernt man erst schätzen, wenn man sie wahrnehmen kann, und wahrnehmen kann man sie erst, wenn man die Einstellungen korrigiert.
    Vielen Dank @ErfinderDesRades

    Das werde ist heute abend gleich mal testen.

    @Dksksm Das ist eine gute Frage...Ich habe noch nicht versucht keine Datei zu öffnen, Danke.

    Nun habe ich aber noch eine Frage:

    Kann ich aus solch einem Array auch ein Wort aus einer Zeile aufgreifen?

    Also mal angenommen in Zeile "x" steht:

    N10 (Fräserbahnkorrektur = 0.02)

    Kann ich ihm dann sagen lese mir bei finden des Wortes "Fräserbahnkorrektur" den Wert 0.02 aus (also in eine Variable)?
    Hey,

    mit einem Schema ist das durchaus möglich. Also, wenn immer in deiner Klammer dieser Zeile eine Zuordnung "=" geschieht.
    Sag mir, um welche Steuerung handelt es sich hierbei? Oder sollte das nur ein Beispiel sein?
    Wenn ja, mach dein Beispiel am besten so explizit wie möglich. :thumbsup:

    Kommentare werden normalerweise durch ein ";" (Semikolon) gekennzeichnet.
    (Na ja, je nach Steuerung halt ^^)

    Grüße
    Option Strict On!
    @Drahuverar

    Ok ich Beschreib das Thema um das es geht mal genauer.

    Wir haben noch eine Alte "MAHO MH1000" mit Phillips Steuerung 443 wenn mich jetzt nicht alles täuscht.

    Die Programme werden mit einer CAD/CAM Software als ISO Daten bei uns im Büro Programmiert.

    Dann wird das Programm über eine DNC Software auf die Maschine übertragen hierfür gibt es einen Sogenanneten PostProzessor der beim bespielen
    der Maschine Steuerungsspezifische Parameter in das Programm schreibt damit die Maschine dann alle benötigten haten hat um das Programm
    ab zu arbeiten.

    Nun ist es so das sich die Stuerung wohl in der Vergangenheit mal auf die Oben genannte geändert hat jedoch der Postprozessor für das DNC Programm nicht.
    Nun resultiert das Problem das der Postprozessor beim bespielen der Maschine nichts mit den Befehlen "G02" oder "G03" in Verbindung mit den Buchstaben "J" und "K"
    anfangen kann.

    Aus diesem Grund wird das seit jahren wohl so gehandhabt das man die Programme ohne "G02" und "G03" erstellt. Das bedeutet das ein Kreis erzeugt wird durch "G01".

    Also Beispiele: Zum Fräsen eines Kreises/ Kreisbogens müssen dem Befehl G02 einige Parameter mitgegeben werden.

    X Koordinaten des Endpunktes in X
    Y Koordinaten des Endpunktes in Y
    Z Koordinaten des Endpunktes in Z
    I Koordinaten des Kreismittelpunktes in relativ zum Startpunkt in X
    J Koordinaten des Kreismittelpunktes in relativ zum Startpunkt in Y

    Der komplette Befehlssatz könnte lauten:

    N.. G02 X70 Y80 Z0 I40 J30

    Da der Postprozessor unseres DNC Programmes jedoch die Werte "I" und "J" nicht zulässt können wir das Programm nicht übertragen.

    Somit macht man den Umweg einen Kreis durch den Befehl "G01" zu programmieren. Das funktioniert auch jedoch besteht dann ein kreis anstatt aus einem Satz z.B. aus 5000 Sätze.

    Im DNC Programm gibt es nun die Möglichkeit ein Programm statt über den Postprozessor auch 1:1 zu übertragen. Jedoch muss der Bediener dem Programm dann alle Parameter hinzufügen welche
    der Postprozessor hinzufügen würde.

    Und an genau dieser Stelle möchte ich mein Programm in Zukunft zum Einstaz bringen.

    Vereinfacht ausgedrückt:

    - Das Programm kommt aus dem Büro
    - Der Bediener öffnet es mit meinem Programm
    - Nun kann er ein Paar Werte auswählen (z.B. Drehrichtung der Werkzeuges....usw.)
    - Danach Klickt er auf Speichern und das Programm ist bereit um es mit der DNC Software per 1:1 auf die Maschine zu kopieren

    Beim öffnen der Datei sollen dann Parameter wie z.B. Werkzeugdurchmersser usw. gleich im Programm angezeigt werden (Ohne das der Bediener diese Datei mauell öffnen muss, es soll alles total simpel
    über mein Programm laufen, damit man am besten nichts wissen muss).

    Das CNC Programm hat z.B. die hier aufgeführte Form:

    N1 (Fidia S.p.A. ISOGRAPH v. 6.0.1 11/25/10 19:21:57)
    N2 (Datei mit korrigierter Fräsermittelpunktsbahn)
    N3 (Werkzeugdurchm. = 20.000)
    N4 (Aufmass = 0.000)
    N5 (Kompensation links)
    N6 (Automatische An-Abfahrbew.)
    N7 (Anfahrbew. reduziert in 0 %)
    N8 (Abfahrbew. reduziert in 0 %)
    N9 (Sicherheitshöhe Z,absolut = 50.000)
    N10 (Annäherungsdistanz,inkremental = 0.000)
    N11 (Annäherungsvorschub = 200)
    N12 (Arbeitsvorschub = 200)
    N13 (Spindel = 600)
    N14 (Ebene - Endtiefe = 32.000)
    N15 (Ebene - Max. Zustellung = 31.000)
    N16 (Ebene - Eilrücklauf)
    N17 M03 S600
    N18 F200
    N19 G00 Z50.000
    N20 G00 X-510.000 Y-10.000 Z50.000
    N21 G00 X-510.000 Y-10.000 Z0.000
    N22 X-509.020 Y-9.952 Z0.000
    N23 X-508.049 Y-9.808 Z0.000
    N24 X-507.097 Y-9.569 Z0.000
    N25 X-506.173 Y-9.239 Z0.000
    N26 X-505.286 Y-8.819 Z0.000
    N27 X-504.444 Y-8.315 Z0.000
    N28 X-503.656 Y-7.730 Z0.000
    N29 X-502.929 Y-7.071 Z0.000
    N30 X-502.270 Y-6.344 Z0.000
    N31 X-501.685 Y-5.556 Z0.000
    N32 X-501.181 Y-4.714 Z0.000
    N33 X-500.761 Y-3.827 Z0.000
    N34 usw. usw. usw.

    Wie oben schon geschrieben geht mein Programm nun her und Zieht aus Zeile 3 den Werkzeugdurchmesser 20.000 heruas und Zeigt diesen dann in einem Informazionsblock am PC Programm an.
    Dies soll quasi mit allen Information von Satz 2 bis Satz 16 passieren.

    Nun muss z.B. Zwischen Satz 16 und Satz 17 eine Weitere Zeile eingefügt werden die der Maschine die Drehrichtung der Spindel angibt und z.B. die Drehzahl.
    Es müssen also verstreut im Programm Informationen eingefügt werden. Dann müssen die Sätze neu Nummeriert werden so das Fortlaufen "N1" "N2" ..... bis zum letzten Satz nummeriert ist.

    Danach Speichert er das Programm und kann es 1:1 über die DNC Software übertragen.

    Das ist das Ziel.

    Natürlich kommen dann noch ausnahmen hinzu das es auch ältere Programme gibt welche diese Informationen nicht enrhalten, deshalb muss das Programm erst einmal abchecken ob diese Informationen überhaupt
    in dem CNC Programm enthalten sind oder nicht.

    sllem schrieb:

    eine Weitere Zeile eingefügt werden
    Steig um von String-Array auf List(Of String). Da kannst Du zwischendurch beliebig Zeilen einfügen oder löschen.
    Das hatten wir doch bereits in Post #2. ;)
    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!
    Ja danke. Das ist richtig. Aber damit habe ich anfangs garnichts hinbekommen.

    Mit dem ob geposteten Beispiel hat bis jetzt halt überhaupt mal was geklappt! :)

    Ich verstehe auch auf Anhieb nicht wie ich von diesem Array weg kommen um genau das selbe mit List (of String) zu erreichen. Habe mit diesem LoS gestern mal rumprobiert aber leider noch überhaupt nichts erreicht bisher....
    ähm - von welchem Array redet ihr?

    Weil mir kommts fast vor, als seist du noch immer mit ArrayList am wursteln.

    Aber solange man die Empfehlung Visual Studio - Empfohlene Einstellungen nicht umgesetzt hat, ists kein Wunder, dass man Array nicht von Arraylist nicht von List(of String) unterscheiden kann.

    :P

    Achso - du kannst das alles ja eh erst heut abend ausprobieren.
    Imo machts dann eiglich keinen Sinn, überhaupt iwas zu besprechen. Es kommt nur immer und immer mehr hinzu, da kann man glaub keinen Überblick behalten, und natürlich vergisst man alles mögliche dabei.

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

    Huhu,

    ich bin wieder da!!! Guten Abend, ich bastle mich nun durch diese List(Of String) Geschichte. Habe einige Beispiele ausprobiert und auch viel gesucht. Ein Teil des Programmcodes ist nun von String-Array auf LoS umgeschrieben.

    Nun hänge ich bei folgender Sache:

    - Meine LoS ist erstellt und wird durch Auswahl mit dem Inhalt einer Textdatei beladen! :thumbup:

    - Anzahl der Sätze werden gezählt und ausgegeben! :thumbup:

    - Durch den Befehl .insert kann ich nun weiter Sätze an beliebigen Stellen hinzufügen! :thumbup:

    - Über die FindIndex Funktion kann ich nun z.B. die erste Zeile finden in der, der Buchstabe "N" steht und mir die Satznummer ausgeben lassen! :thumbup:

    Nun zum aktuellen Hänger...

    Ich möchte nun das er mir die Zeile in dem er den ersten Buchstaben "N" gefunden hat (egal in welcher Zeilennumer das ist) nun aus der List Of String raus löscht, ABER WIE?? :cursing:

    Meine LoS nennt sich "fileaslist" nun habe ich es schon mit "fileaslist.remove( & GesuchterWert1 &)" versucht "GesuchterWert1" ist die Variable in dieser er über die Find Funktion den ersten Buchstaben "N" findet
    aber das nimmt er nicht an.

    Dann habe ich es versucht indem ich die Zeilennummer manuell angebe um zu checken ob er das nimmt "fileaslist.remove(12)" aber auch hier passiert rein garnichts.

    Kann mir jemand sagen wie ich das lösen kann?


    Gruß

    SLLEM
    Also folgendes funtktioniert beim mir - gerade so mal nur hingeklascht:

    VB.NET-Quellcode

    1. Dim lst As New List(Of String)
    2. lst.Add("test")
    3. lst.Add("nest")
    4. lst.Add("test3")
    5. Dim fstr = lst.Find(Function(value As String)
    6. Return value(0) = "n"c
    7. End Function)
    8. lst.Remove(fstr)

    Wenn dies bei Dir nicht funktioniert, dann zeig mal bitte ein klein wenig Code von Dir - bzw. teile uns doch Deine genaue Fehlermeldung mit, denn mit "dies nimmt er nicht an" - damit kann keiner wissen was gemeint ist.

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