string array nach string duchsuchen

  • VB.NET

Es gibt 42 Antworten in diesem Thema. Der letzte Beitrag () ist von ahnungsloserVB.

    string array nach string duchsuchen

    Hay,
    ich hab folgendes Problem:
    Ich habe eine textdatei eingelesen und diese als string array "gespeichert":

    VB.NET-Quellcode

    1. Dim datei AsStreamReader = NewStreamReader(einlesen)
    2. Dim strDatei AsString = datei.ReadToEnd()


    In der datei befinden sich viele werte:

    1 11 PN301.1001 PA05 PY3536737.746 PX5455937.909 PZ310.630
    2 11 PN201.1003 PA05 PY3536738.881 PX5456410.283 PZ322.356
    3 11 PN6723.0107 PA03 PY3536900.790 PX5455318.840 PZ301.150
    4 21 PN301.1001
    5 22 ms1.000000 ih1.500
    6 22 AP6723.0107 Hz44.4121 Zd100.9295
    7 22 AP201.1003 Hz260.9572 Zd98.4046
    8 24 PN3.1001 PA74 Sd49.172 Hz276.8334 Zd102.2361
    9 24 PN3.1002 PA74 Sd61.310 Hz317.9288 Zd104.5838
    10 24 PN3.1003 PA74 Sd58.789 Hz319.4395 Zd104.8252

    jetzt möchte ich z.b alle px werte, sprich "5455937.909" usw. auslesen und in ein array abspeichern damit ich mit den werten weiter rechnen kann. Mein ansatz:

    VB.NET-Quellcode

    1. Dim
    2. Teile() AsString = strDatei.Split("X")


    Er gibt mir aber nur das aus:
    1 11 PN301.1001 PA05 PY3536737.746 P

    Ich komm nicht weiter, hilfe

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

    Meinst du sowas:

    VB.NET-Quellcode

    1. Dim str As String = "1 11 PN301.1001 PA05 PY3536737.746 PX5455937.909 PZ310.630"
    2. Dim Teile() As String = str.ToString.Split("X")
    3. MsgBox(Teile(1))


    Um den Teil nach "X" zu kriegen musst du den Array in der Split-Variable ändern
    @ahnungsloserVB:: Willkommen im Forum. :thumbup:
    Sieh Dir mal dies an:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim lines() = IO.File.ReadAllLines("C:\Temp\Test.txt")
    3. For Each line In lines
    4. If line.Contains("PX") Then
    5. Dim teile() = line.Split(" "c)
    6. MessageBox.Show(teile(5).Substring(2))
    7. End If
    8. Next
    9. End Sub
    Und: Nutze den [VB]-Tag zur Markierung von VB-Quellcode.
    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 schön, das hat schon mal funktioniert.
    Ich hab noch eine frage, was muss ich verändern damit ich nach den anderen werten wie z.B "Hz" oder "Zd" usw. suchen kann.Sprich ich möchte für jede "Punktbezeichnung" immer nur die Zahlenwerte angezeigt bekommen.

    ahnungsloserVB schrieb:

    was muss ich verändern
    Hier gib den Such-String an.

    VB.NET-Quellcode

    1. If line.Contains("PX") Then
    Entsprechend des Dir bekannten Aufbaus der Datei, von dem ich annehme, dass die Werte nicht gemischt sind, greifst Du auf den korrekten Index und den korrekten Offset zu.
    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!

    VB.NET-Quellcode

    1. Dim lines() = IO.File.ReadAllLines(einlesen)For Each line In lines
    2. If line.Contains("Hz") Then
    3. Dim Teile() = line.Split(" "c)Console.WriteLine(Teile(5).Substring(2))
    4. End If
    5. Next[


    bekomme ich einen System.IndexOutOfRangeException

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

    ahnungsloserVB schrieb:

    IndexOutOfRangeException
    In .NET sind Indizes null-basiert, nimm also den "richtigen" Index 4:

    VB.NET-Quellcode

    1. Console.WriteLine(Teile(4).Substring(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!
    etwas umständlich aber es geht:

    VB.NET-Quellcode

    1. Private counts As New List(Of String) 'Alle gefundenen Einträge
    2. ...
    3. counts.RemoveRange(0, counts.Count)
    4. Dim input = System.IO.File.ReadAllText("Pfad")
    5. Dim newInput As String = String.Empty
    6. Dim strings As String() = input.Split({" "c})
    7. For Each item In strings
    8. If item.Contains("Hz") Then
    9. Dim enumar As IEnumerator = item.GetEnumerator
    10. Do While enumar.MoveNext()
    11. Dim lettr = DirectCast(enumar.Current, Char)
    12. If Integer.TryParse(lettr, New Integer) OrElse lettr = "."c Then
    13. newInput &= lettr
    14. End If
    15. Loop
    16. Console.WriteLine(newInput)
    17. counts.Add(newInput)
    18. newInput = String.Empty
    19. End If
    20. Next

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

    Er gibt mir nicht die richtige werte aus :(

    VB.NET-Quellcode

    1. Dim lines() = IO.File.ReadAllLines(einlesen)
    2. For Each line In linesIf line.Contains("Hz") Then
    3. Dim Teile() = line.Split(" "c)
    4. Console.WriteLine(Teile(4).Substring(2))End If
    5. Next


    Mit einlesen:
    1 11 PN301.1001 PA05 PY3536737.746 PX5455937.909 PZ310.630
    2 11 PN201.1003 PA05 PY3536738.881 PX5456410.283 PZ322.356
    3 11 PN6723.0107 PA03 PY3536900.790 PX5455318.840 PZ301.150
    4 21 PN301.1001
    5 22 ms1.000000 ih1.500
    6 22 AP6723.0107 Hz44.4121 Zd100.9295
    7 22 AP201.1003 Hz260.9572 Zd98.4046
    8 24 PN3.1001 PA74 Sd49.172 Hz276.8334 Zd102.2361
    9 24 PN3.1002 PA74 Sd61.310 Hz317.9288 Zd104.5838
    10 24 PN3.1003 PA74 Sd58.789 Hz319.4395 Zd104.8252
    11 24 PN3.1004 PA74 Sd71.561 Hz333.9190 Zd105.8891
    bekomme ich:
    100.9295 (entspricht Zd)
    98.4046 (entspricht Zd)
    49.172 (entspricht Sd)
    ...

    Danke, der Ansatz von Rushden funktioniert einwandfrei.
    Da ich mit VB nicht so vertraut bin, kann ich mit newInput weiter arbeiten (einzelne werte addieren, multiplizieren usw.) und kann ich den newInput an eine andere klasse übergeben?
    (ich frag nur vorsichtshalber)
    ich versuche den newInput in ein string zu speichern

    VB.NET-Quellcode

    1. counts.RemoveRange(0, counts.Count)
    2. Dim input = System.IO.File.ReadAllText(einlesen) 'eingelesende datei ins input speichern
    3. Dim newInput As String = String.Empty 'den newinput deklarieren und diesen "0" setzen
    4. Dim strings As String() = input.Split({" "c}) 'datei nach leer zeichen trennen und diesen in strings speichern
    5. For Each item In strings 'für alle items="px" in der gesplitete datei
    6. If item.Contains("PX") Then 'wenn item enthält PX dann
    7. Dim enumar As IEnumerator = item.GetEnumeratorDo While enumar.MoveNext()
    8. 'Do
    9. Dim lettr = DirectCast(enumar.Current, Char)If Integer.TryParse(lettr, New Integer) OrElse lettr = "."c Then
    10. newInput &= lettr
    11. 'test = newInput
    12. End If
    13. ' Loop Until enumar.MoveNext()
    14. Loop
    15. test = newInput
    16. counts.Add(newInput)'test = newInput
    17. newInput = String.Empty
    18. ' test = newInput
    19. End If
    20. Next
    21. Console.WriteLine("{0}", test)


    Aber ich weiß nicht an welcher stelle ich es machen soll damit ich alle werte abgespeichert habe. ich möchte den quellcode in eine funktion packen und dann den "newInput" mit allen werten als rückgabe wert zurückgeben. vllt geht es gar nicht auf die art und weise (die ich versuche).. kann mir da jmd weiter helfen?
    @ahnungsloserVB:: Es gibt einen kleinen aber feinen Unterschied zwischen

    VB.NET-Quellcode

    1. System.IO.File.ReadAllText(...)
    2. ' und
    3. System.IO.File.ReadAllLines(...)
    Ich weiß nicht, ob Dir bewusst ist, was der wesentliche Unterschied zwischen dem Code von @RushDen: und mir ist.
    Versuch das mal herauszufinden.
    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!
    das eine ist für einen einfachen string und das andere für einen array... wenn ich versuche den quellcode so zu anpassen damit er auf array hinaus läuft merkert er nur rum..

    VB.NET-Quellcode

    1. Dim input() = System.IO.File.ReadAllLines(einlesen) 'eingelesende datei ins input speichern
    2. Dim newInput As String = String.Empty 'den newinput deklarieren und diesen "0" setzen
    3. Dim strings() = input.Split(" "c)

    bei input.Split sagt er dass split kein member of array ist, aber so wie du es gemacht hast davor, hat es problemlos funktioniert (split und array).. ich sitze schon seit 2 tagen an dem problem, ich glaub das übersteigert einfach meine kompetenzen

    ahnungsloserVB schrieb:

    merkert er nur rum..
    Dann sieh Dir den Post #3 noch mal genau an.
    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 ich hab soweit hin bekommen dass er mir dieses in string speichert und ich auch mit diesen weiter arbeiten kann, das problem ist dass er jetzt nur die letzte zeile ausgibt, bei der er den PX wert gefunden hat... dazu gibt er alle zahlen aus (nicht gesplitet) ohne buchstaben in der jewaligen zeile


    VB.NET-Quellcode

    1. Dim input() = IO.File.ReadAllLines(einlesen) 'eingelesende datei ins input speichern
    2. Dim newInput As String = String.Empty 'den newinput deklarieren und diesen "0" setzen
    3. For Each item In input 'für alle items="px" in der gesplitete datei
    4. If item.Contains("PX") Then 'wenn item enthält PX dann
    5. Dim strings() = item.Split(" "c)
    6. Dim enumar As IEnumerator = item.GetEnumerator
    7. Do While enumar.MoveNext()
    8. 'Do
    9. Dim lettr = DirectCast(enumar.Current, Char)
    10. If Integer.TryParse(lettr, New Integer) OrElse lettr = "."c Then
    11. newInput &= lettr
    12. 'test = newInput
    13. End If
    14. ' Loop Until enumar.MoveNext()
    15. Loop
    16. 'Console.WriteLine(newInput)
    17. counts.Add(newInput)
    18. test = newInput
    19. newInput = String.Empty
    20. 'test = newInput
    21. End If
    22. Next
    23. Console.WriteLine(test)


    bei anlesen von daten:
    1 11 PN301.1001 PA05 PY3536737.746 PX5455937.909 PZ310.630
    2 11 PN201.1003 PA05 PY3536738.881 PX5456410.283 PZ322.356
    3 11 PN6723.0107 PA03 PY3536900.790 PX5455318.840 PZ301.150
    4 21 PN301.1001
    5 22 ms1.000000 ih1.500

    bekomme ich raus:
    3116723.0107033536900.7905455318.840301.150

    ahnungsloserVB schrieb:

    VB.NET-Quellcode

    1. newInput &= lettr
    Dann solltest Du Deine Resultate nicht einfach aneinanderklatschen.
    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!