String spliten in dem Trennzeichen ";" und strings mit "";""

  • Allgemein

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Kangaroo.

    String spliten in dem Trennzeichen ";" und strings mit "";""

    Servus,

    Ich habe ein kleines Problem. Ich lese mit vba eine csv-Datei ein in der folgende Zeile auftaucht:
    Demoprojekt;MaxMustermann;TKG;14.02.2011;13.06.2014;Beauftragt;Airbus;"A2.2.2.3_General_Process_Technologies_(tooling;_monitoring:_modelling;_inline_NDT)";13;1;;;;;European;

    Ich splitte diese Zeile mit dem Separator ;. Jetzt habe ich aber das Problem, dass mit dieser String: "A2.2.2.3_General_Process_Technologies_(tooling;_monitoring:_modelling;_inline_NDT)"
    ebenfalls gesplittet wird. Das soll er natürlich nicht.

    Hat jemand eine Idee wie ich es anstellen kann, dass mir die Objekte durch ";" getrennt werden nicht aber der string?

    Gruss,
    Claus
    Ich würde sagen abfragen ob ein seperator oder zwei vorhanden sind und dann entsprechend splitten.

    Oder aber auch wenn du die genaue anzahl der ";" seperatoren weist einfach auf die zahl begrenzen und splitten und den rest so ausgeben.
    zb so (bei .net)

    VB.NET-Quellcode

    1. Dim sstring As String = "Demoprojekt;MaxMustermann;TKG;14.02.2011;13.06.2014;Beauftragt;Airbus;""A2.2.2.3_General_Process_Technologies_(tooling;_monitoring:_modelling;_inline_"
    2. Dim testgesplittet() As String = sstring.Split(CChar(";")) 'erster Seperator
    3. Dim testgesplittet2() As String = sstring.Split(CChar("""")) 'zweiter Seperator
    4. MsgBox(testgesplittet(0)) 'erster Seperator
    5. MsgBox(testgesplittet(1)) 'erster Seperator
    6. MsgBox(testgesplittet(2)) 'erster Seperator
    7. MsgBox(testgesplittet(3)) 'erster Seperator
    8. MsgBox(testgesplittet(4)) 'erster Seperator
    9. MsgBox(testgesplittet(5)) 'erster Seperator
    10. MsgBox(testgesplittet(6)) 'erster Seperator
    11. MsgBox(testgesplittet2(1)) 'zweiter Seperator


    MFG
    GOOGLE ist mein Meister :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Bady“ ()

    Ohhh... Ich sehe gerade, dass mir der die Nachricht wegen Ihrer Länge abgeschnitten wurde. Hier ein kleineres Beispiel:
    blabla;Max;Mustermann;"Hallo;Welt";;;SoSo

    Mit folgendem Code lese ich ein uns splitte:

    VB.NET-Quellcode

    1. Line Input #hfile, OneLine 'in OneLine steht nun: "blabla;Max;Mustermann;"Hallo;Welt";;;SoSo"
    2. myArr = Split(OneLine, ";")


    Das Ergebniss ist folgendes:
    myArr(0)="blabla"
    myArr(1)="Max"
    myArr(2)="Mustermann"
    myArr(3)=""Hallo"
    myArr(4)="Welt""
    myArr(5)=""
    myArr(6)=""
    myArr(7)="SoSo"

    Ich weiß warum er es so splittet wie er es splittet. Meine Frage ist ob ich es so splitten, dass folgendes herauskommt:
    myArr(0)="blabla"
    myArr(1)="Max"
    myArr(2)="Mustermann"
    myArr(3)=""Hallo;Welt""
    myArr(4)=""
    myArr(5)=""
    myArr(6)="SoSo"

    Denn ich habe noch mehr Zeilen zu importieren und nicht jede von diesen Zeilene enthälten einen "problematischen" String , in den meisten Zeilen steht statt soetwas wie "Hallo;Welt" einfach "Hallo".

    Ich würde sagen abfragen ob ein seperator oder zwei vorhanden sind und dann entsprechend splitten.
    Was meinst du damit. Ich weiß ja wieviele Seperatoren ich verwende. Ich verwende einen ";". Aber das ist vielleicht nicht der richtige Weg.

    Noch eine Idee?
    für csv gibts doch den TextFieldparser. Ich such mal Sample. Kannst du übrigens jetzt auch suchen - Stichwort hasteja

    Oder guggegar CSV mit OleDb einlesen

    Achtung! 2 Gedanken! Bitte nicht den einen unterschlagen.

    Edit:
    Ich fund schließlich:

    VB.NET-Quellcode

    1. Private Sub Reload()
    2. Using prs = New TextFieldParser(_Data.FullName, Encoding.UTF8, True)
    3. prs.Delimiters = ";".Split
    4. While Not prs.EndOfData
    5. Dim flds = prs.ReadFields
    6. Dim name = flds(0)
    7. Dim lpar = flds(1)
    8. Dim minutes = Single.Parse(flds(3))
    9. Dim average = Single.Parse(flds(4))
    10. Dim remark = flds(5)
    11. JobDts.JobInfo.AddJobInfoRow(name, lpar, minutes, average, remark)
    12. End While
    13. End Using
    14. End Sub

    Das parst halt korrekt nach den Csv-Spezifikationen.

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

    Oder nach altmodischem Rezept selbst gebacken:

    VB.NET-Quellcode

    1. Function splitExt(ByVal input As String, ByVal splitChar As Char) As String()
    2. Dim hyphenOFF As Boolean = True, sb As New StringBuilder, sList As New List(Of String)
    3. ' loop characters in input string
    4. For Each c As Char In input
    5. ' split char ?
    6. If c = splitChar And hyphenOFF Then sList.Add(sb.ToString) : sb = New StringBuilder : Continue For
    7. ' hyphen -> toggle flag
    8. If c = """"c Then hyphenOFF = Not hyphenOFF
    9. ' add char to substring
    10. sb.Append(c)
    11. Next
    12. ' add remainder
    13. sList.Add(sb.ToString)
    14. ' return array
    15. Return sList.ToArray
    16. End Function

    Für eine Regex Lösung bin ich gerade mal zu faul .... das als Extension zu schreiben auch ;)

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