Split mit Passendem Datei Inhalt ersetzen

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Aod.

    Split mit Passendem Datei Inhalt ersetzen

    Hallo Leute,
    ich brauche mal wieder eure hilfe.

    Es geht um follgendes Problem.
    Ich habe einen split(1).Trim der mir z.B. den Wert XP SP 3 zurück gibt.
    Jetzt soll in einer bestimmten Textdatei nach diesem Eintrag gesucht werden, und dessen Wert weiter benutzt werden.

    Sprich in der Textdatei steht pro zeile:
    XP SP 3=Windows XP Service Pack 3

    Somit müsste ich jetzt den Wert Windows XP Service Pack 3 bekommen.
    Mein Code bisher

    VB.NET-Quellcode

    1. For i As Integer = (CheckedListBox2.CheckedItems.Count - 1) To 0 Step -1
    2. itemText = CheckedListBox2.GetItemText(CheckedListBox2.CheckedItems(i))
    3. If itemText.Contains(Bookmark) Then
    4. Dim split() As String = itemText.Split(New String() {"-"}, StringSplitOptions.RemoveEmptyEntries)
    5. With oDoc.Bookmarks("Nr" + Nr).Range
    6. .Text = vbTab & split(1).Trim
    7. .Font.Bold = CInt(False)
    8. End With
    9. Next
    Hi,

    Ich würde sagen: Datei zeilenweise auslesen, mit "=" splitten, überprüfen ob der erste Wert die Abkürzung ist: wenn ja: zweiten Wert verwenden, wenn nein: weitersuchen.
    Mit freundlichen Grüßen,
    Thunderbolt
    Sieht mir nach einer Verwendung der List(Of T) aus.
    Hab eben was innen Texteditor reingeklimpert:

    VB.NET-Quellcode

    1. Private Class OSDetails
    2. Public Property sOSShortName As String
    3. Public Property sOSLongName As String
    4. End Class
    5. Private Sub processData()
    6. Dim FSIn1 As New FileStream(MyOSNameTextFile, FileMode.Open, FileAccess.Read)
    7. Dim SRIn1 As New StreamReader(FSIn1, System.Text.Encoding.GetEncoding("Windows-1252"))
    8. Dim OSNamesList As New List(Of OSDetails)
    9. Dim sbInLine As New StringBuilder
    10. Do While Not SRIn1.EndOfStream
    11. sbInLine.Clear()
    12. sbInLine.Append(glSRIn1.ReadLine)
    13. Dim lSplitLine() As String = sbInLine.ToString.Split("="c)
    14. Dim flds = New OSDetails With { _
    15. .sOSShortName = lSplitLine(0).ToString,
    16. .sOSLongName = lSplitLine(1).ToString}
    17. OSNamesList.Add(flds)
    18. Loop


    Also eine Klasse für Deine OS-Begriffe und die List(Of OSDetails) mit den Werten aus der "INI" für die OS Begriffe füllen. Da ist jetzt natürlich keine Sicherheit gegen Leerzeilen oder sonst was krummes drinnen.


    In Deiner Schleife baust Du so ein Konstrukt rein, in dem du den Wert aus Deinem Split in der Liste suchst.
    Bei einem Treffer bekommst du den OS-Klarnamen geliefert, im anderen Fall einen Hinweis auf ein nicht bekanntes OS.

    VB.NET-Quellcode

    1. Dim OSTextRow As OSDetails = OSNamesList.Find(Function(c)
    2. Dim os As String = sSplitter 'String aus Split(1) aus deinem Text
    3. Return c.sOSShortName = os
    4. End Function)
    5. If OSTextRow IsNot Nothing Then
    6. WasAuchImmer = OSTextRow.sOSLongName
    7. Else
    8. WasAuchImmer = "unbekanntes OS"
    9. EndIf


    Ob der Code so läuft kann ich nicht sagen, mögen kleine Fehler drinne sein. Notepad++ ist als Entwicklungsumgebung nicht so der Brüller :)

    hth
    HaRo

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

    Hallo HaRoWagner,
    erstmal danke für deine ausführliche antwort,

    allerdings habe ich da noch eine frage zu. Ich schätze mal mit Klasse war in VB dies gemeint:

    Hinzufügen -> Klasse -> OSDetails.vb

    dort dann der inhalt

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Text
    3. Public Class OSDetails
    4. Public Property sOSShortName As String
    5. Public Property sOSLongName As String
    6. Private Sub processData()
    7. Dim FSIn1 As New FileStream(My.Application.Info.DirectoryPath & "\Datei.txt", FileMode.Open, FileAccess.Read)
    8. Dim SRIn1 As New StreamReader(FSIn1, System.Text.Encoding.GetEncoding("Windows-1252"))
    9. Dim OSNamesList As New List(Of OSDetails)
    10. Dim sbInLine As New StringBuilder
    11. Do While Not SRIn1.EndOfStream
    12. sbInLine.Clear()
    13. sbInLine.Append(SRIn1.ReadLine)
    14. Dim lSplitLine() As String = sbInLine.ToString.Split("="c)
    15. Dim flds = New OSDetails With { _
    16. .sOSShortName = lSplitLine(0).ToString,
    17. .sOSLongName = lSplitLine(1).ToString}
    18. OSNamesList.Add(flds)
    19. Loop
    20. End Sub
    21. End Class



    In Form1 habe ich dann dies hier eingetragen:

    VB.NET-Quellcode

    1. For i As Integer = (CheckedListBox2.CheckedItems.Count - 1) To 0 Step -1
    2. itemText = CheckedListBox2.GetItemText(CheckedListBox2.CheckedItems(i))
    3. If itemText.Contains(Bookmark) Then
    4. Dim split() As String = itemText.Split(New String() {"-"}, StringSplitOptions.RemoveEmptyEntries)
    5. Dim gefunden As String
    6. Dim OSTextRow As OSDetails = OSNamesList.Find(Function(c)
    7. Dim os As String = split(1) 'String aus Split(1) aus deinem Text
    8. Return c.sOSShortName = os
    9. End Function)
    10. If OSTextRow IsNot Nothing Then
    11. gefunden = OSTextRow.sOSLongName
    12. Else
    13. gefunden = "unbekanntes OS"
    14. End If
    15. With oDoc.Bookmarks("Nr" + Nr).Range
    16. .Text = vbTab & gefunden
    17. .Font.Bold = CInt(False)
    18. End With
    19. End If
    20. Next



    Jetzt bekomme ich noch in Form1 die Meldung:
    OSNamesList wurde nicht deklariert. Irgend was mache ich also noch falsch.

    Ist bestimmt was ganz simples wegen der einbindung der Klasse?
    Bin halt noch zu unerfahren mit VB...

    vb-paradise.de/user/16433-harowagner/