none
convertfrom-string template, Verständnisfrage RRS feed

  • Frage

  • convertfrom-string müsste ja ideal zum Bereinigen von Dateien für das leidige Word Serienbrief Thema mit schlechte Adressdateien mit und ohne Titel sein?

    Musterdatei:

    Name;Vorname
    Dr. Max; Mustermann
    Hans; Mustermann
    Mag. Susi; Musterfrau

    was ist hier falsche

    wofür benötigt man den STERN?

    $template = @'
    {titel:Dr.}{vorname*:meinvorname};{name:meinname}
    {titel:}{vorname*:deinvorname};{name:deinname}
    '@
    
    Get-Content C:\temp\test.txt | ConvertFrom-String -TemplateContent $template

    ConvertFrom-String : Die angegebene Vorlage ist ungültig: Es gibt zwei Instanzen der nicht sequenziellen Eingeschaft 'titel' unter 'Zeile '1', Spalte '2'' und 'Zeile
    '2', Spalte '2'' in der übergeordneten Spanne ''root''.. Um weitere Informationen zur Vorlagensyntax zu erhalten, geben Sie 'Get-Help ConvertFrom-String' ein.

    $template = @'
    {titel:Dr.} {vorname*:meinvorname};{name:meinname}
    {vorname*:deinvorname};{name:deinname}
    '@
    
    Get-Content C:\temp\test.txt | ConvertFrom-String -TemplateContent $template


    vorname name   
    ------- ----   
    Name    Vorname



    Sonntag, 18. Oktober 2020 17:24

Antworten

  • Wenn ich das cmdlet und die Erklärung von Dr. Tobi und Deine Beispiel-Daten richtig verstanden habe, sind Deine Beispieldaten nicht gut geeignet und auch zu wenig. Schau Dir mal dieses Video an: Weltner Sophisitcated Techniques of Plain Text Parsing

    In Deinen Beispiel-Daten fängt ein neuer Datensatz mit einem Titel an, der aber nicht in allen Datensätzen vorhanden ist. Du musst aber das erste Feld des Datensatzes mit einem Stern markieren. Du hast aber nicht in allen Datensätzen einen Titel am Anfang. Vielleicht gibt es dafür auch noch eine Lösung aber so isses erstmal ein Anfang, glaube ich.   :-) 

    Hier ein Beispiel mit ein paar mehr Daten:

    $data = @'
    VorName;Name
    Dr. Max; Mustermann
    Hans; Mustermann
    Mag. Susi; Musterfrau
    Dipl.Ing. Rudi; Ratlos
    B. A. Fritz; Furz
    Hinz; Fischer
    B. Sc. Rolf; Rammler
    Dipl.Ing. Ralf; Ratlos
    '@
    
    $template = @'
    {vorname*:Dr. Max}; {nachname:Mustermann}
    {vorname*:Hans}; {nachname:Mustermann}
    {vorname*:Mag. Susi}; {nachname:Musterfrau}
    {vorname*:Dipl.Ing. Rudi}; {nachname:Ratlos}
    {vorname*:B. A. Fritz}; {nachname:Furz}
    '@
    
    $data  | ConvertFrom-String -TemplateContent $template  -OutVariable output

    Das Ergebnis sieht dann bei mir so aus:

    vorname        nachname  
    -------        --------  
    VorName        Name
    Dr. Max        Mustermann
    Hans           Mustermann
    Mag. Susi      Musterfrau
    Dipl.Ing. Rudi Ratlos
    B. A. Fritz    Furz      
    Hinz           Fischer
    B. Sc. Rolf    Rammler
    Dipl.Ing. Ralf Ratlos

    Viel Spaß! ;-)

    Edit:

    Du kannst ja einen weiteren Verarbeitungsschritt dranhängen, wo Du den Titel vom Vornamen trennst ... 

    $output |
    ForEach-Object {
        $_.vorname -match '^(\w+\..*\s+)*(\w+)$' | Out-Null
        [PSCustomObject]@{
            titel    = if ($Matches.count -gt 2 ) { $Matches[1] }else {''}
            vorname  = $Matches[2]
            nachname = $_.nachname
        }
    }

    Die Ausgabe sieht dann so aus:

    titel      vorname nachname  
    -----      ------- --------
               VorName Name
    Dr.        Max     Mustermann
               Hans    Mustermann
    Mag.       Susi    Musterfrau
    Dipl.Ing.  Rudi    Ratlos
    B. A.      Fritz   Furz
               Hinz    Fischer
    B. Sc.     Rolf    Rammler
    Dipl.Ing.  Ralf    Ratlos
    ... to be continued ... ;-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH-666 Mittwoch, 21. Oktober 2020 01:53
    • Als Antwort vorgeschlagen Vector BCO Mittwoch, 21. Oktober 2020 07:16
    • Als Antwort markiert Dont - Worry Mittwoch, 21. Oktober 2020 10:50
    Mittwoch, 21. Oktober 2020 01:06

Alle Antworten

  • Moin,

    ich muss mich jetzt mal outen: Ich habe es noch nie geschafft, ConvertFrom-String sinnvoll einzusetzen.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Sonntag, 18. Oktober 2020 18:37
  • wenn ich mir die Beispiele so ansehe, glaube ich es funktioniert am besten mit XML oder typischen json Files. Also nicht in einer Zeile.
    Sonntag, 18. Oktober 2020 18:42
  • Wenn ich das cmdlet und die Erklärung von Dr. Tobi und Deine Beispiel-Daten richtig verstanden habe, sind Deine Beispieldaten nicht gut geeignet und auch zu wenig. Schau Dir mal dieses Video an: Weltner Sophisitcated Techniques of Plain Text Parsing

    In Deinen Beispiel-Daten fängt ein neuer Datensatz mit einem Titel an, der aber nicht in allen Datensätzen vorhanden ist. Du musst aber das erste Feld des Datensatzes mit einem Stern markieren. Du hast aber nicht in allen Datensätzen einen Titel am Anfang. Vielleicht gibt es dafür auch noch eine Lösung aber so isses erstmal ein Anfang, glaube ich.   :-) 

    Hier ein Beispiel mit ein paar mehr Daten:

    $data = @'
    VorName;Name
    Dr. Max; Mustermann
    Hans; Mustermann
    Mag. Susi; Musterfrau
    Dipl.Ing. Rudi; Ratlos
    B. A. Fritz; Furz
    Hinz; Fischer
    B. Sc. Rolf; Rammler
    Dipl.Ing. Ralf; Ratlos
    '@
    
    $template = @'
    {vorname*:Dr. Max}; {nachname:Mustermann}
    {vorname*:Hans}; {nachname:Mustermann}
    {vorname*:Mag. Susi}; {nachname:Musterfrau}
    {vorname*:Dipl.Ing. Rudi}; {nachname:Ratlos}
    {vorname*:B. A. Fritz}; {nachname:Furz}
    '@
    
    $data  | ConvertFrom-String -TemplateContent $template  -OutVariable output

    Das Ergebnis sieht dann bei mir so aus:

    vorname        nachname  
    -------        --------  
    VorName        Name
    Dr. Max        Mustermann
    Hans           Mustermann
    Mag. Susi      Musterfrau
    Dipl.Ing. Rudi Ratlos
    B. A. Fritz    Furz      
    Hinz           Fischer
    B. Sc. Rolf    Rammler
    Dipl.Ing. Ralf Ratlos

    Viel Spaß! ;-)

    Edit:

    Du kannst ja einen weiteren Verarbeitungsschritt dranhängen, wo Du den Titel vom Vornamen trennst ... 

    $output |
    ForEach-Object {
        $_.vorname -match '^(\w+\..*\s+)*(\w+)$' | Out-Null
        [PSCustomObject]@{
            titel    = if ($Matches.count -gt 2 ) { $Matches[1] }else {''}
            vorname  = $Matches[2]
            nachname = $_.nachname
        }
    }

    Die Ausgabe sieht dann so aus:

    titel      vorname nachname  
    -----      ------- --------
               VorName Name
    Dr.        Max     Mustermann
               Hans    Mustermann
    Mag.       Susi    Musterfrau
    Dipl.Ing.  Rudi    Ratlos
    B. A.      Fritz   Furz
               Hinz    Fischer
    B. Sc.     Rolf    Rammler
    Dipl.Ing.  Ralf    Ratlos
    ... to be continued ... ;-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH-666 Mittwoch, 21. Oktober 2020 01:53
    • Als Antwort vorgeschlagen Vector BCO Mittwoch, 21. Oktober 2020 07:16
    • Als Antwort markiert Dont - Worry Mittwoch, 21. Oktober 2020 10:50
    Mittwoch, 21. Oktober 2020 01:06
  • coole Lösung,

    ich denke mit -split " " wäre es auch relativ einfach und lesbar möglich

    $a = "dr. hans"
    $b = "fredi"
    
    
    $a -split " "
    $b -split " "

    Mittwoch, 21. Oktober 2020 10:58
  • Klar ... aber wenn Du einen Bachelor of Arts hast oder einen Bachelor of Science  ... ;-)  (B. A.  oder B. Sc.) ...

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 21. Oktober 2020 17:00