manrique
Goto Top

Csv file mit leeren Spalten - erste, zweite und letzte Zeile fix

Hallo an alle,

ein csv file soll mit neuer Anordnung (teilw. leere Spalten) der Spalten unter neuem Namen gespeichert werden. Die erste, zweite und letzte Zeile im neuen file sind vorgegeben:

erste Zeile: 1, 9999, 2021, 1012021, 4, 6, EUR
zweite Zeile: 100, PV, 3, 31012021, 1, 0.00
letzte Zeile: 111, 0.00

In der ersten Zeile variabel: Spalte C = $jahr, Spalte D = 101 + $jahr
In der zweiten Zeile variabel: Spalte D = $belegdatum, Spalte E = $monat

Das Ergebnis sollte so aussehen (im jpg sind in C1 und D1:D4 jedoch noch VJ-Werte):
result

Folgender Code (geht wahrscheinlich einfacher) bringt fast das gewünschte Ergebnis.

offene Fragen:
ist in der Header-Variable eine weitere Variable möglich? Fehler wenn ich das so mache: $header "1", "992", $jahr
wie kann ich am Ende des Codes das replace auf die ersten zwei Zeilen einschränken?
$quellordner = 'C:\TEMP\source'  
$done = 'C:\TEMP\done'  
$zielordner = 'C:\TEMP'  

if(!(Test-Path $zielordner)){md $zielordner -Force | out-null}
#$log = @()

$konto_replacements = @{
        "3576" = "357600"  
        "3577" = "357700"  
        "9900" = "990000"  
        "-" = "999000"  
    }
gci $quellordner -Filter *.csv -File | %{
    $csv = gc $_.Fullname -Encoding String | ?{$_ -notmatch '^\s*$'} | ConvertFrom-CSV -Delimiter ";"  
    $targetfile = "$zielordner\$($_.Basename)_Import$($_.Extension)"  

     $new = $csv | ?{$_.gkonto -eq '9900'} | %{                
        $konto = $_.konto
        $konto = $konto_replacements.GetEnumerator() | ?{$_.key -eq $konto} | %{$_.Value}
        $konto = @{$true = $konto_replacements.'-';$false = $konto}[$konto -eq $null]  

        $date = $_.belegdatum.replace(".", "")  
        $global:date = $date

        $global:year = $date.Year
        
        $nr = $_.belegnr
        $global:nr = $nr

        $betrag = $_.betrag.replace(".", "") #zuerst Tausendertrennzeichen entfernen  
        $betrag = $betrag.replace(",", ".")  #dann Dezimaltrennzeichen ändern  
        
        $text = $_.text

        $leer = ""  
					
        [pscustomObject]@{
            100 = 110
            PV = $konto
            3 = $leer
            $global:date = $date
            $global:nr = $nr
            "0.00" = $leer  
            betrag = $betrag
            H = $leer
            I = $leer
            J = $leer
            K = $leer
            L = $leer
            M = $leer
            N = $leer
            O = $text
        }
        
    } 
    $new | export-csv $targetfile -Delimiter ";" -NoType -Encoding UTF8 -Verbose  
     
    #Move-Item -Path $quellordner\*.csv -Destination $done
  
    }
    $header = "1", "992", "2021", "1012021", "4", "6", "EUR", "H", "I", "J", "K", "L", "M", "N", "O" #ACHTUNG: Jahreszahl (2021) und Beginn (1012021) sind statisch - bei Jahreswechsel anpassen!  
    # CSV importieren
    $filedata = Import-csv $targetfile -Delimiter ";" -Header $header  
    
    # temporäre Spaltenbezeichnung "betrag" in Spalte G löschen 
    $filedata | %{
    $_.EUR = $_.EUR -replace 'betrag',''  
    }
    $lastval_A = 111
    $lastval_B = "0.00"  
    $lastLine = "{0};{1}" -f $lastval_A,$lastval_B    #an Delimiter anpassen: komma oder semilkom, etc.  

    # Daten zurückschreiben
    $filedata | export-csv $targetfile -Delimiter ";" -NoType -Encoding UTF8 -Verbose  
    $lastLine | Add-Content -Path $targetfile
    
    # temporäre Spaltenbezeichnungen in Zeile 1 + 2 löschen
    $Zeilen = (Get-Content $targetfile) | ForEach-Object {
    
    $zähler = 1
		#foreach($Zeile in $Zeilen) {
			If($zähler -lt 3) {
			$_.replace("H",'').replace("I",'').replace("J",'').replace("K",'').replace("L",'').replace("M",'').replace("N",'').replace("O",'')  
			#}
			#zähler erhöhen
			$zähler++
			}
    } | Set-Content $targetfile

Kann mir bitte jemand helfen?
DANKE Manrique

Content-ID: 649614

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

Ausgedruckt am: 24.11.2024 um 01:11 Uhr