Textdatei lesen

  • Hallo,
    aus unserem ERP System kann ich mir eine *.csv Datei erstellen. Diese kann ich dann als *.txt Datei ablegen.
    In der ersten Spalte stehen 7 stellige Codenummern, in der zweiten Spalte ein Text.
    Ich möchte nun die erste Spalte nach unten durchsuchen nach einer Zeichenfolge, die ich mit UINumEntry vorgebe.
    Wenn ich eine Übereinstimmung gefunden habe, soll der Text aus der zweiten Spalte in einen string geschrieben werden.
    Hat zufällig jemand so etwas schon einmal gemacht, oder kann mir einen Tipp geben ?

    Einmal editiert, zuletzt von mischwarz ()

  • ANZEIGE

  • zufällig jemand so etwas schon einmal gemacht


    Nicht nur zufällig ;)



    Jetzt ist die Datei zum Lesen offen.
    Dann zeilenweise einlesen, erst die erste Zeile:
    In der ersten Zeile ist entweder schon EOF (EndOfFile) oder nicht, EOF ist vordefiniert und kann mit beliebigen Textdateien so benutzt werden:

    Code
    dummystring:=ReadStr(dateihandle);
    WHILE (NOT (dummystring="EOF")) DO
      !....hier die Datenverarbeitung angewendet auf "dummystring" (s.U.)
      !Danach:
      !Neue Zeile einlesen mit ReadStr, Zähler springt automatisch eine Zeile weiter:
      dummystring:=ReadStr(dateihandle);
    ENDWHILE
    close dateihandle;



    Close am Ende nicht vergessen, auch in Fehlerfällen.
    Innerhalb der Schleife hast Du in jedem Durchgang einmal den Inhalt der jeweiligen Zeile in "dummystring". Den musst Du dann vernünftig durchsuchen:

    Code
    IF StrLen(dummystring)>1 then
        IF ((strMatch(dummystring,1,suchstring))<=strLen(dummystring))
          .... Hier wurde der Suchbegriff gefunden.
        endif
      endif


    Mit StrPart kannst Du nun die Zeile splitten und den relevanten Teil wegspeichern (Ich würde die Ausgabe erst nach Beendigung der Schleife machen.) Mit ValToStr kannst Du die evtl. numerische Eingabe in einen Suchstring umwandeln.


    Grüße,
    Michael

  • Hallo,
    wenn Du die Datei Zeilenweise ausliest, musst Du beachten, dass ein String nur 80 Zeichen lang sein kann und Du zum Einlesen längerer Zeilen den Zeilenrest erst im nächsten Lesevorgang erhältst.
    CSV-Dateien haben in der Regel ein Trennzeichen (z.B. ";"). Die Instruktion "ReadStr" kann aber auch so verwendet werden, dass jeweils nur die nächste Spalte ausgelesen wird, also bis zum Trennzeichen.
    Dies wird wie folgt programmiert:

    Code
    dummystring:=ReadStr(dateihandle\Delim:=";"\DiscardHeaders);


    Gruß
    Micky

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind. (Albert Einstein)

  • Entschuldigung, dass ich mich erst jetzt zurück melde.
    Ich habe es nun wie folgt gelöst.

  • Geht das mit \Delim:=";" ?
    Ich dachte immer daß Delimiters im ASCII-Code geschrieben werden müssen.

    Gruß Roland


    Wie poste ich falsch?

    Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Ich bin wie ich bin. Die Einen kennen mich, die Anderen können mich.

    Konrad Adenauer

  • Ich habe so im RSO probiert. Und es hat funktioniert.

  • Hallo,
    es gibt einen Unterschied beim Einlesen von Daten zwischen dem realen und dem virtuellen Controller
    Beim realen Controller mussten wir die folgende Zeile zum Einlesen verwenden

    Code
    IF RobOS() THEN  
      st_Result := ReadStr(TextFile\RemoveCR\DiscardHeaders);


    und beim virtuellen die folgende.

    Code
    ELSE
        st_Result := ReadStr(TextFile);


    da der Zeilenumbruch unterschiedlich behandelt wird.
    Eventuell hast Du beim lesen bis zum nächsten Delimiter kein Problem, aber ich würde es auf jeden Fall nochmal am realen Controller testen.
    Gruß
    Micky

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind. (Albert Einstein)

  • Ich häng mich mal hier dran....


    kämpfe auch mit der Begrenzung String Zeichelänge maximal 80

    Ich möchte ein Modul lesen mit einen Arry von Robtargets, doch die 80 zeichen reichen ja nichtmal für ein einzelnes Robtarget


    das einlesen wollte ich jetzt stoppen bei "],["

    trage ich das so in ReadStr(logfile\Delim:="],[" ein wird jedes Komma als Zeilentrennung interpretiert, auch ohne die Klammern

    auch das ganze als ASCII Hex ReadStr(logfile\Delim:="\5d"+"\2c"+"\5b"); gibt das gleiche Ergebniss


    wo liegt mein "Denk"Fehler?

  • Hallo Zusammen,


    ich hab mal eine .csv Datei in einen String Array eingelesen , natürlich kommt es bei Überschreitung der max.Zeichenlänge zum Zeilenumbruch.

    RobiMan

    In deinem Fall mit robtarget

    Erste Zeile Stringlänge mit StrLen die Länge des Strings ermitteln , dann mit StrMatch nach ]] suchen , gefunden robtarget komplett

    Hab dann angefangen den String zu zerlegen zb. mit StrMatch nach [[ oder ],[ suchen dann mit StrPart string vor und nach dem Suchergebis zwischenspeichern

    Immer wieder die Stringlänge von der zweiten Zeile ermittelt und dort mit StrMatch nach ]] oder suchen. Ist die Gesamtstringlänge kleiner 80 Zeichen

    den String speichern . Igendwann hat man einen Array von Teilstrings die den Inhalt der robtarget ergibt .

    Hab dann aus diesen Teilstrings ein Programmmodul erstellt.Die Konvertierung hab ich im Task 2 abgearbeitet das Modul ins Home Verzeichnis geladen.Task 1 hats geladenund abgearbeitet. Was einfacheres ist mir nicht eingefallen. Viel Spass beim konvertieren


    LG Bernhard

  • Ich hatte vor einiger Zeit ein ähnliches Problem und mich dann dazu entschlossen das ganze über RawBytes zu machen um diese Beschränkung zu umgehen und etwas zu haben was möglichst vielseitig einsetzbar ist. Inwieweit mir das gelang, bleibt abzuwarten :D


    Hier mal ein Beispielcode. Ich habe hier einen Record für meinen speziellen Fall benutzt aber das kann man ja beliebig umstricken.


    Vielleicht hilft es ja schon alleine als Denkanstoß

  • Hallo,


    bezüglich der Delimiter steht folgenden im Handbuch:


    Zitat

    Wenn das Argument \Delim verwendet wird, wird jedes Zeichen im angegebenen Zeichenfolge-Argument sowie standardmäßig auch Zeilenvorschubzeichen als signifikanter Teil der Zeile betrachtet.

    Das heißt, bei Angabe von \Delim:="],[" erfolgt die Trennung beim Auftreten des Zeichens '[', ',' , ']' bzw. beim Zeilenvorschubzeichen (\0A), da jedes der Zeichen einzeln betrachtet wird und nicht der komplette String gesucht wird.


    Zitat

    Um nicht alphanumerische Zeichen anzugeben, verwenden Sie \xx , wobei xx die hexadezimale Darstellung des ASCII-Codes für das Zeichen ist (Beispiel: TAB wird durch \09 angegeben).

    Die Hex-Codes müssen laut Handbuch nur dann verwendet werden, wenn es sich um nicht darstellbare Zeichen handelt (Steuerzeichen: HEX 00 - HEX 1F). Alle anderen Zeichen können ganz normal angegeben werden (z.B ";")

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind. (Albert Einstein)

    Einmal editiert, zuletzt von Micky ()

  • Hi Micky


    dacht mir schon das nicht so funktioniert wie bei string einfach ein + dazwischen.

    Mit den Handbüchern ist das so immer eine Sache, oft überliest man die kleinen Wörter auf die es letztendlich aber ankommt.


    Mein Ziel das umbenennen von Modulen hab ich jetzt aber aufgegeben, ist mir zu umständlich.

    Da ich von den vielen Modulen eh immer nur eins laden muss, kann das Modul ja den gleichen Namen besitzen, da reicht es völlig aus wenn die Dateien im Home Verzeichniss einen unterschiedlichen Namen besitzen, das geht ja zum Glück Problemlos mit Save.

    Dann einfach ins Modul noch einen String mit den Typnamen rein un gut is.

    Werd jetzt diesen Weg verfolgen.

Hilfe und Support für ABB Roboter Programmierung, Konfiguration, Inbetriebnahme finden Sie hier im ABB Roboter Forum. ABB Rapid Programmierung ist einfach, die Roboterforum Community hilft sehr gerne.

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden