TextZeilen einlesen und ein Stück abschneiden

  • Olla alle zusammen,

    zunächst ein gutes erfolgreiches und vor allem ein gesundes neues Jahr für euch alle.

    Ich glaub ich krieg Hirnfrost: ich möchte die Zeilen eines Textes einlesen und alles ab dem Unterstrich weg haben.

    die Textzeilen sehen so aus:

    Rechnername1_Port1

    Rechnername2_Port2
    .

    .

    .

    Rechnername32_Port32

    Jetzt habe ich schon so viel mit Stringsplit und Arrays etc. gearbeitet aber vermutlich hat mir die spanische Wintersonne das Hirn frittiert. Ich krieg das nicht hin ;(

    Spoiler anzeigen

    #include <Array.au3>

    #include <AutoItConstants.au3>

    #include <File.au3>

    #include <FileConstants.au3>

    #include <MsgBoxConstants.au3>

    #include <String.au3>

    #include <StringConstants.au3>

    $sFilePath = "E:\Portnamechanger\PortStrings.txt"


    Example()

    Func Example()

    Local $aFileRead[1]

    Local $hFileOpen = FileOpen($sFilePath, $FO_READ)

    Local $a_String[1]

    If $hFileOpen = -1 Then

    MsgBox($MB_SYSTEMMODAL, "", "Es ist während dem lesen der Datei ein Fehler aufgetreten.")

    Return False

    EndIf


    Local $s_String = ""

    Local $a_String[1]

    Local $aArray

    For $i = 1 To 32 Step 1

    ReDim $aFileRead[UBound($aFileRead) + 1]

    $aFileRead[UBound($aFileRead) - 1] = Stringsplit(FileReadLine($hFileOpen, $i), "_")

    _ArrayAdd($a_String, $aFileRead[UBound($aFileRead) - 1])

    Next

    _ArrayDisplay($a_String)

    EndFunc ;==>Example

    Mit dem Code im Spoiler sieht das Ergebnis so aus:

    Row|Col 0

    [0]|

    [1]|1

    [2]|

    [3]|2

    [4]|Rechnername1

    [5]|Port1

    [6]|2

    [7]|Rechnername2

    [8]|Port2

    [9]|2

    [10]|Rechnername3

    [11]|Port3

    Hat jemand eine Idee a) woher die Einträge mit den Zahlen herrühren und b) wie ich die Einträge Port x weg bekomme? mit Redim vielleicht...
    Oder ist der komplette Ansatz Grütze?

  • Hi hipfzwirgel ,

    angenommen, dass deine Datei welche du einliest "data.txt" heißt und die folgenden Zeilen hat:

    Code
    Rechnername1_Port1
    Rechnername2_Port2
    Rechnername3_Port3
    Rechnername4_Port4
    Rechnername5_Port5
    Rechnername6_Port6
    Rechnername7_Port7
    Rechnername8_Port8
    Rechnername9_Port9
    Rechnername10_Port10

    [...] und auch nichts anderes drin steht außer Rechnername und Port, wie beschrieben, würde es bspw. so aussehen:

    Die ist allerdings nicht robust. Nur in Ordnung für diesen einen konkreten Fall. Aber vielleicht reicht dir dies ja auch schon?


    Viele Grüße
    Sven

  • Hallo Sven,

    erstmal vielen lieben Dank für den Vorschlag. :klatschen:
    Im Grunde geht es genau darum. Ich habe drei KVM_Switche bei denen ich die "Dongle"-Bezeichung ändern soll. Also das "Suffix" _Port2 oder ähnlich soll weg
    bzw. geändert werden. Jeder der KVMs hat 32 Ports ist also alles überschaubar.

    Ich stelle also fest mein Ansatz geht in Richtung Grütze und auf die Art und Weise wie du sie vorschlägst wäre ich im Leben nicht gekommen. Eigentlich schade das es fast keine Arrayfunktionen gibt mit denen man Indizes direkt bearbeiten kann wie z.B. statt Stringsplit _ArrayIndexsplit oder so ähnlich.

  • Hat jemand eine Idee a) woher die Einträge mit den Zahlen herrühren

    Der Grund ist, dass das Ergebnis von StringSplit ein Array ist.
    Und dieses Array weist du 1. $aFileRead zu. Wichtig: Du weist das ganze Array hinzu - nicht nur das letzte Element!
    Damit übergibst du deinem _ArrayAdd ein Array anstatt einem einzelnen Wert.
    Und ArrayAdd fügt in dem Fall alle Elemente des StringSplit-Arrays an dein Array $a_String.

    b) wie ich die Einträge Port x weg bekomme? mit Redim vielleicht...

    Oder ist der komplette Ansatz Grütze?

    Ja du kannst das ganze viel schlanker und übersichtlicher halten. Offensichtlich hast du dich mit den ganzen Arrays verheddert.

    Ein anderer Ansatz wurde dir bereits gezeigt.
    Es geht aber auch ohne RegEx und ebenso schmal:

    Edit: Wenn RegEx kein Problem wäre, dann könnte man auch gleich einen Einzeiler draus basteln:

    AutoIt
    #include <Array.au3>
    
    $aFile = StringRegExp(FileRead("test.txt"), '(?m)^([^_]+)', 3)
    
    _ArrayDisplay($aFile)
  • Dein Ansatz AspirinJunkie, ohne RegEx gefällt mir besser als mein ursprünglicher, da dieser einfach Beginner freundlicher ist 👍 .


    Ansonsten schön, dass wir dein Thema lösen bzw. die Fragestellung beantworten konnten hipfzwirgel 😀 .

    Viele Grüße
    Sven

  • Ich hatte erst überlegt, was evtl. noch einfacher nachvollziehbar wäre.
    Hab da an _StringBetween gedacht aber das gibt blöderweise immer nur ein Array zurück, so dass das dann doch ausartet.
    Evtl. hat noch jemand eine möglichst einfache und nachvollziehbare (trotzdem noch robuste) Variante.

    Fändest du folgendes evtl. besser nachvollziehbar?:

    AutoIt
    $aFile[$i] = StringSplit($aFile[$i], "_")[1]
  • Die Frage ging an mich oder an hipfzwirgel, AspirinJunkie?

    Falls sie an mich ging: Ja, liest sich noch besser, aber kommt darauf an was man kennt und weiß (Konzepte etc.) und was nicht.
    Wenn ich mit Arrays vertraut bin, dann ist dies sicherlich eine gut nachvollziehbare Variante. Wenn ich RegEx mag und kenne, dann nutze ich lieber RegEx etc.
    Erst wenn man verschiedene Lösungswege für ein Problem umsetzen kann und kennt, wird man gut in der Lage sein zu beurteilen was man am besten für das jeweils vorliegende Problem nimmt, um es zu lösen.

    Von daher: "Alle Wege führen nach Rom" 😀 .

    Viele Grüße
    Sven

  • Moin,

    noch ein "Weg nach Rom", die "handwerkliche" Basisvariante. Bei derart überschaubaren Problemen, kann man auch auf einfache Lösungen zurückgreifen:

  • $aFile[$i] = StringSplit($aFile[$i], "_")[1]

    AspirinJunkie : Die Variante hab ich noch nie gesehen.

    Ich wusste gar nicht das man den flag auch außerhalb setzen kann, mache immer ein Komma und dann die halt die zahl oder die vorgegebenen Constanten und dann wird wieder eingeklammert.

    Aber man lernt ja nie aus :D danke für die Erleuchtung des Tages^^.

  • $aFile[$i] = StringSplit($aFile[$i], "_")[1]

    AspirinJunkie : Die Variante hab ich noch nie gesehen.

    Ich wusste gar nicht das man den flag auch außerhalb setzen kann, mache immer ein Komma und dann die halt die zahl oder die vorgegebenen Constanten und dann wird wieder eingeklammert.

    Aber man lernt ja nie aus :D danke für die Erleuchtung des Tages^^.

    MojoeB Das ist kein Flag außerhalb, das ist die Array-Zahl. Die steht immer dahinter in Klammern, wenn man diese nutzen will, in diesem Fall, den 1. Eintrag ([0] enthält ja die Anzahl).

  • oke ich sehe es grad selbst^^ es entsteht ein 2d array mit stringsplitt aber ich wusste dennoch nicht das man direkt hinter die Funktion dann ArrayZahl setzen kann.

    Danke danke aufmerksamer Moombas . :D

  • Nein!

    StringSplit gibt immer ein eindimensionales Array (1d) zurück und die "Arrayzahl" ist der Index auf das Element.

    Bei dieser Art der Notation muss man aber vorsichtig sein, weil man einen Error produzieren kann, wenn der Index größer ist, als die Anzahl der Elemente im Array.

    Dabei sollte man stehts wissen was man tut ;)