Benutzer mit den meisten Antworten
Daten aus vielen .htm-Dateien auslesen und in csv-datei schreiben

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.csvKann mir jemand helfen?
Vielen Dank für Eure Hilfe- Bearbeitet David0815 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- Als Antwort vorgeschlagen tonibert Donnerstag, 22. Dezember 2016 22:04
- Als Antwort markiert Denniver ReiningMVP, Moderator Freitag, 23. Dezember 2016 00:19
-
$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''- Als Antwort markiert Denniver ReiningMVP, Moderator Freitag, 23. Dezember 2016 00:19
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- Als Antwort vorgeschlagen tonibert Donnerstag, 22. Dezember 2016 22:04
- Als Antwort markiert Denniver ReiningMVP, Moderator Freitag, 23. Dezember 2016 00:19
-
$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''- Als Antwort markiert Denniver ReiningMVP, Moderator Freitag, 23. Dezember 2016 00:19
-
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
-
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