none
Daten aus vielen .htm-Dateien auslesen und in csv-datei schreiben RRS feed

  • Frage

  • Hallo zusammen,



    ich versuche mich gerade an meinem ersten Powershell-Script, komme aber nicht weiter. Ich habe in einem Ordner knapp 50.000 HTML Dateien und möchte aus allen Dateien eine bestimmt Passage auslesen. IN allen HTML Dateien gibt es die folgende Information mit stets gleichem Aufbau

    <meta name="description" content="Produktname, Produktnummer, Kategorienummer" />

    Ich möchte nun die fett markierten Informationen aus allen Dateien auslesen und in eine einzige CSV-Datei schreiben.

    Folgende Versuch schlägt leider fehl:  

    Select-String -path D:\Htmdateien\*.htm -Pattern "<meta name="description" content="Produktname, Produktnummer, Kategorienummer" />" | ConvertTo-csv -As "List" | out-file $env:userprofile\Desktop\Linkliste.csv

    Kann mir jemand helfen?

    Vielen Dank für Eure Hilfe
    • Bearbeitet David0815 Donnerstag, 22. Dezember 2016 08:32
    Donnerstag, 22. Dezember 2016 08:32

Antworten

  • Moin,

    so einfach ist es nicht - ich denke ja, dass die fett markierten Inhalte in jeder Datei unterschiedlich sind, da kann man sie schlecht als Pattern verwenden ;-)

    Hier mal auf die Schnelle:

    $in_path = "C:\temp\html01"
    $out_file = "c:\temp\product_info.csv"
    
    
    $meta_string = '<meta name="description"'
    "Produktname, Produktnummer, Kategorienummer" | Out-File $out_file -Force
    $files = Get-ChildItem $in_path -Filter *.html
    foreach ($file in $files) {
        $content = (Get-Content $file.FullName) -join " "
        $pos = $content.Indexof($meta_string)
        if ($pos -gt -1) {
            $pos1 = $pos + $meta_string.Length + 1
            $pos2 = $content.IndexOf("/>", $pos1)
            if ($pos2 -gt $pos1) {
                $meta_content = ($content.Substring($pos1, $pos2-$pos1) -replace "content=","").Trim()
                $meta_content = $meta_content.Substring(1,$meta_content.Length - 2)
                $meta_content | Out-File $out_file -Append
            } else {
                Write-Host "closing bracket missing in ($file.FullName)"
            }
        } else {
            Write-Host "meta string not found in ($file.FullName)"
        }
    }
    Ist noch enorm optimierungsfähig, aber würde erst mal den Zweck erfüllen.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Donnerstag, 22. Dezember 2016 09:43
  • $liste = Get-Content -Path D:\Htmdateien\*.htm | ForEach-Object{
        If($_ -match '<meta name="description" content="(?<Produktname>.+), (?<Produktnummer>\d+), (?<Kategorienummer>\d+)" />'){
    	    [PSCustomObject]@{
    		    Produktname = $Matches.Produktname
    		    Produktnummer = [INT]$Matches.Produktnummer
                Kategorienummer = [INT]$Matches.Kategorienummer
    	    }
        }
    }
    $liste
    
    Du wirst vermutlich den regulären Ausdruck noch anpassen müssen, aber das könnte so erst mal ein guter Start sein, oder?  :-)
    Die Liste ($Liste) kannst Du dann prima per Export-CSV in eine Datei schreiben. Bitte nicht per Out-File, damit machst Du die ganze Arbeit von vorher wieder kaputt.  ;-)


    Grüße - Best regards

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

    Donnerstag, 22. Dezember 2016 09:46

Alle Antworten

  • Moin,

    so einfach ist es nicht - ich denke ja, dass die fett markierten Inhalte in jeder Datei unterschiedlich sind, da kann man sie schlecht als Pattern verwenden ;-)

    Hier mal auf die Schnelle:

    $in_path = "C:\temp\html01"
    $out_file = "c:\temp\product_info.csv"
    
    
    $meta_string = '<meta name="description"'
    "Produktname, Produktnummer, Kategorienummer" | Out-File $out_file -Force
    $files = Get-ChildItem $in_path -Filter *.html
    foreach ($file in $files) {
        $content = (Get-Content $file.FullName) -join " "
        $pos = $content.Indexof($meta_string)
        if ($pos -gt -1) {
            $pos1 = $pos + $meta_string.Length + 1
            $pos2 = $content.IndexOf("/>", $pos1)
            if ($pos2 -gt $pos1) {
                $meta_content = ($content.Substring($pos1, $pos2-$pos1) -replace "content=","").Trim()
                $meta_content = $meta_content.Substring(1,$meta_content.Length - 2)
                $meta_content | Out-File $out_file -Append
            } else {
                Write-Host "closing bracket missing in ($file.FullName)"
            }
        } else {
            Write-Host "meta string not found in ($file.FullName)"
        }
    }
    Ist noch enorm optimierungsfähig, aber würde erst mal den Zweck erfüllen.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Donnerstag, 22. Dezember 2016 09:43
  • $liste = Get-Content -Path D:\Htmdateien\*.htm | ForEach-Object{
        If($_ -match '<meta name="description" content="(?<Produktname>.+), (?<Produktnummer>\d+), (?<Kategorienummer>\d+)" />'){
    	    [PSCustomObject]@{
    		    Produktname = $Matches.Produktname
    		    Produktnummer = [INT]$Matches.Produktnummer
                Kategorienummer = [INT]$Matches.Kategorienummer
    	    }
        }
    }
    $liste
    
    Du wirst vermutlich den regulären Ausdruck noch anpassen müssen, aber das könnte so erst mal ein guter Start sein, oder?  :-)
    Die Liste ($Liste) kannst Du dann prima per Export-CSV in eine Datei schreiben. Bitte nicht per Out-File, damit machst Du die ganze Arbeit von vorher wieder kaputt.  ;-)


    Grüße - Best regards

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

    Donnerstag, 22. Dezember 2016 09:46
  • Hallo,

    danke für die Rückmeldung.

    Kurze nochmal zum Problem: <meta name="description" content="Produktname, Produktnummer, Kategorienummer" />

    Die fett markierten Angaben sind natürlich nur Platzhalter. In jeder HTM-Datei sind sie unterschiedlich, aber immer komma-separiert.

    Der Einfachheit halber wäre es auch ok, wenn die ganze fett-markierte Passage als ganzes ausgelesen wird und in die CSV, Datei geschrieben würde. 

    Aber wie generierie ich dnn die Export CSV? Wenn die csv Datei in diesem Pfad liegen soll:   C:\export\exportlist.csv

    Danke für die Hilfe!!!


    • Bearbeitet David0815 Donnerstag, 22. Dezember 2016 10:24
    Donnerstag, 22. Dezember 2016 10:18
  • Anfrage hat sich schon erledigt. Ich konnte mir dem Vorschlag von Evgenij Smirnov das Problem lösen.

    Danke!


    Donnerstag, 22. Dezember 2016 10:37
  • in meinem Beispiel wäre es dann:
    $liste | Export-CSV -Path C:\export\exportlist.csv -NoTypeInformation -Delimiter ';'


    Grüße - Best regards

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

    Donnerstag, 22. Dezember 2016 11:18
  • Anfrage hat sich schon erledigt. Ich konnte mir dem Vorschlag von Evgenij Smirnov das Problem lösen.

    Danke!


    Du solltest Dich trotzdem mit den von Olaf verwendeten Techniken (RegEx-Matching und PSCustomObject) beschäftigen.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Donnerstag, 22. Dezember 2016 15:23
  • Bestimmt isser schon im Weihnachtsurlaub.  ;-) Problem gelöst - Haken dran - weg hier ...  :-D

    Grüße - Best regards

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

    Donnerstag, 22. Dezember 2016 15:25