humpe99
Goto Top

Mit Powershell 5 min-Files auslesen und Inhalt Monatsfile schreiben

Hallo zusammen

Ich mache gerade meine ersten Gehversuche mit Powershell. Gegeben sind txt-Files mit den Daten einer Wetterstation, welche alle 5 Minuten anfallen und so aussehen:

-0.7

817.4
0.0


17:50
16.11.2018

Ziel: Jeden Monat möchte ich diese Einzelfiles auswerten und Monatsfiles erstellen. Die sähen dann so aus:

...
16.11.2018 17:50;-0.7;0.0;817.4
16.11.2018 17:55;-0.8;0.0;817.5
...

Folgendes Powershell-Script soll mir diese Arbeit abnehmen:

#Station bzw. Loggerbezeichnung
$Station = "meineWetterstation"  
$Jahr = "2018"  
$Monat = "11"  

$Pfad = "E:\data\raw\input\" + $Jahr + "_" + $Monat + "\"  
$Ausgabefile ="E:\data\raw\output\" + $Station + "_" + $Jahr + "_" + $Monat + ".csv"  

#Für jedes File im Pfad:
foreach($File in $Pfad)
{
	$Inhalt = Get-Content $File
	#Für jede Zeile im File
	foreach($temp in $Inhalt)
	{
	$Trenner = $temp.Split("`r`n")  
	$leer = $Trenner
	$Temperatur = $Trenner[1]
	$leer = $Trenner[2]
	$Luftdruck[3]
	$leer = $Trenner[4]
	$leer = $Trenner[5]
	$leer = $Trenner[6]
	$Zeit = $Trenner[7]
	$Datum = $Trenner[8]
	
	$Ausgabe = "$($Datum);$($Zeit);$($Temperatur);$($Niederschlag);$($Luftdruck)" | Out-File -Encoding "UTF8" -FilePath $Ausgabefile -Append  
	}	
}

#jetzt UTF-8 ohne BOM

$path_utf8_ohne_BOM = Get-Content $Ausgabefile
[System.IO.File]::WriteAllLines($Ausgabefile, $path_utf8_ohne_BOM);


Leider hagelt es Fehlermeldungen...

Get-Content : Ein Teil des Pfades "E:\data\raw\input\2018_11\" konnte nicht gefunden werden.  
In E:\data\raw\scripts\wetterdaten.ps1:13 Zeichen:12
+     $Inhalt = Get-Content $File
+               ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (E:\data\raw\input\2018_11\:String) [Get-Content], DirectoryNotFoundExcepti
   on
    + FullyQualifiedErrorId : GetContentReaderDirectoryNotFoundError,Microsoft.PowerShell.Commands.GetContentCommand

Get-Content : Der Pfad "E:\data\raw\output\meineWetterstation_2018_11.csv" kann nicht gefunden werden, da er nicht vorhanden ist.  
In E:\data\raw\scripts\wetterdaten.ps1:34 Zeichen:23
+ $path_utf8_ohne_BOM = Get-Content $Ausgabefile
+                       ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (E:\data\raw\mei...ion_2018_11.csv:String) [Get-Content], ItemNotFoundExceptio
   n
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand

Ausnahme beim Aufrufen von "WriteAllLines" mit 2 Argument(en):  "Der Wert darf nicht NULL sein.  
Parametername: contents"  
In E:\data\raw\scripts\wetterdaten.ps1:35 Zeichen:1
+ [System.IO.File]::WriteAllLines($Ausgabefile, $path_utf8_ohne_BOM);
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) , MethodInvocationException
    + FullyQualifiedErrorId : ArgumentNullException

...ich wäre froh um etwas Hilfe bei der Strukturierung der Probleme und danke euch im Voraus für jeden Hinweis!

Gruss, Humpe

Content-ID: 394479

Url: https://administrator.de/contentid/394479

Ausgedruckt am: 26.11.2024 um 09:11 Uhr

Pjordorf
Pjordorf 02.12.2018 um 21:36:04 Uhr
Goto Top
Hallo,

Zitat von @humpe99:
Get-Content : Ein Teil des Pfades "E:\data\raw\input\2018_11\" konnte nicht gefunden werden.  
> In E:\data\raw\scripts\wetterdaten.ps1:13 Zeichen:12
Was genau steht dort?

   + CategoryInfo          : ObjectNotFound: (E:\data\raw\input\2018_11\:String) [Get-Content], DirectoryNotFoundException
Und auch mal hier geschaut warum dort nach E:\data\raw\input\2018_11\:String gesucht wird?

 Get-Content : Der Pfad "E:\data\raw\output\meineWetterstation_2018_11.csv" kann nicht gefunden werden, da er nicht vorhanden ist.  
Das ist ja auch kein Pfad sondern eine Datei. Warum?

ich wäre froh um etwas Hilfe bei der Strukturierung der Probleme
Deine Probleme sind durch der Ausgaben deiner Fehler schon sauber strukturiert und sollten in der reihenfolge des auftretens abgeabeitet werden. Wir sagen eher Dubggen dazu. Zu Powershell ist auch dein Internet mit Hilfen, Tutorials (PDF sowie YT und Beispielen) voll und warten nur auf dein finden und durcharbeiten.

https://www.google.com/search?q=powershell+for+dummies
https://www.google.com/search?q=powershell+tutorial
https://www.google.com/search?q=powershell+debugging

Gruß,
Peter
erikro
erikro 03.12.2018 um 08:57:34 Uhr
Goto Top
Moin,
Zitat von @humpe99:
 $Pfad = "E:\data\raw\input\" + $Jahr + "_" + $Monat + "\"  
> $Ausgabefile ="E:\data\raw\output\" + $Station + "_" + $Jahr + "_" + $Monat + ".csv"  
> 
> #Für jedes File im Pfad:
> foreach($File in $Pfad)

1. ist $Pfad kein Array, sondern ein String, 2. steht da auch kein Dateipfad drin. Deshalb wird das so nichts. Lösung:

$files = get-childitem $Pfad
foreach($file in $files)


$Inhalt = Get-Content $File 
> #Für jede Zeile im File 
> foreach($temp in $Inhalt) 
> { 
> $Trenner = $temp.Split("`r`n")  

Wie Du ja schon im Kommentar schreibst, steht in $temp die Zeile des ausgelesenen Files. Wie willst Du eine Zeile am Zeilenumbruch splitten? Deshalb sind auch Deine Variablen alle leer außer ironischerweise $leer, in der die Zeile steht. face-wink Die Zeilen stehen in $temp bis $temp[8].

hth

Erik
137846
137846 03.12.2018 aktualisiert um 13:01:05 Uhr
Goto Top
$folderInput = 'D:\JaLeckMichAmArschThorstenDörnbachNaImmerNochDerAlteFicker'  
gci $folder -Filter *.txt -File | %{
    $c = gc $_.FullName
    [pscustomobject]@{
        Datum = (get-date "$($c[8]) $($c[7])")  
        Wert1 = $c[1]
        Wert2 = $c[3]
        Wert3 = $c[4]
    }
} | group {$_.Datum.toString("yyyy_MM")} | %{  
    $_.Group | export-csv "$folder\Wetterstation_$($_.Name).csv" -Delimiter ";" -NoType -Encoding UTF8  
}
Gruß A.