lithov
Goto Top

CSV Werte automatisch ändern

Hi

ich brauche ein kleines Script, dass eine Spalte einer CSV Datei in Werte für eine Lagerampel ändert und diese csv dann per ftp auf meinen webserver bringt.

Spalte Anzahl muss geprüft werden auf
Wert >=30 wird dann aus gegeben zu Wert "grün"
Wert zwischen 1 und 29 wird dann aus gegeben zu Wert "gelb"
Wert =0 oder negativ wird zu Wert "rot" ausgegeben.

Das ganze wird unter einem neuen Namen als csv mit den anderen spalten der Ursprungstabelle gespeichert und per FTP hochgeladen.
Das Script wird dann zeitlich über die Win Aufgabenplanung ausgeführt.

Wer kann mir das gegen Honorar Schreiben?

Danke gruß
Litho

Content-Key: 3377461097

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

Printed on: May 19, 2024 at 13:05 o'clock

Member: colinardo
Solution colinardo Jul 19, 2022 updated at 09:41:31 (UTC)
Goto Top
Servus.
simples Powershell "plain ftp" Beispiel (Beispiel bei verschlüsseltem FTPs / SFTP mit WinSCP gibt's gerne per PN, findet sich aber auch hier schon im Forum):
# --- Variablen --------------------
# Quelldatei
$csvfile_in = 'E:\daten.csv'  
# geänderte Zieldatei
$csvfile_out = 'E:\daten_neu.csv'  
# ftp server pfad
$FTP_TARGET = 'ftp://ftp.domain.tld/remotepath/zieldatei.csv'  
# username
$FTP_USERNAME = 'XXXXXXXXXXXXX'  
# password
$FTP_PASSWORD = 'XXXXXXXXXXXXXXXXXXXXX'  
# ----------------------------------
# plain ftp upload function
function Upload-File([string]$path,[string]$url,$username,$password){
    try{
        $request = [System.Net.FtpWebRequest]::Create($url)
        $request.Method = [System.Net.WebRequestMethods+FTP]::UploadFile
        $request.Credentials = New-Object System.Net.NetworkCredential($username,$password)
        [byte[]] $bytes = [System.IO.File]::ReadAllBytes($path)
        [System.IO.Stream]$stream = $request.GetRequestStream();
        $stream.Write($bytes,0,$bytes.Length)
        $stream.Close(); $stream.Dispose()
        $response = [System.Net.FtpWebResponse]$request.GetResponse()
        $result = $response.StatusDescription
        $response.Close()
        return $result
    }catch{
        throw $_.Exception.Message
        return $false
    }
}
# importiere csv mit ";" delimiter 
$csv = Import-CSV $csvfile_in -Delimiter ";"  
# Zeilen der CSV verarbeiten
$csv | %{
    $farbe = $_.Anzahl
    # farbe je nach Wert zuordnen
    switch([int64]$_.Anzahl){
        {$_ -ge 30}{$farbe = 'grün'}  
        {$_ -ge 1 -and $_ -lt 30}{$farbe = 'gelb'}  
        {$_ -le 0}{$farbe = 'rot'}  
    }
    # Spalte mit neuem Wert setzen
    $_.Anzahl = $farbe
}
# geänderte Datei in CSV exportieren
$csv | export-csv $csvfile_out -Delimiter ";" -NoType -Encoding UTF8  
# und per FTP hochladen
Upload-File -path $csvfile_out -url $FTP_TARGET -username $FTP_USERNAME -password $FTP_PASSWORD
Wie immer ohne Gewähr für Leib und Leben.

Grüße Uwe
Member: lithov
lithov Jul 19, 2022 at 10:31:29 (UTC)
Goto Top
Was für eine Reaktionszeit.... Damit habe ich nicht gerechnet. Super vielen Dank erstmal.

Mit meinem laienhaften Wissen wird hier zeilenweise der lagerbestand umgesetzt oder?

in meiner Quelldatei ist eine Spalte mit der Überschrift

;verfügbar;und weitere Spalten;davor; und danach;
100
50
30
15

-1

so in etwas muss man sich die Spalte vorstellen, dazu
Member: colinardo
colinardo Jul 19, 2022 updated at 10:35:14 (UTC)
Goto Top
Zitat von @lithov:
Mit meinem laienhaften Wissen wird hier zeilenweise der lagerbestand umgesetzt oder?
Es wird nach deinem Post oben in der Spalte "Anzahl" der Farbwert entsprechend der Zahl ersetzt, heißt deine Spalte anders, musst du das Wort "Anzahl" in den Zeilen 36-44 des Skripts auch an deinen Namen anpassen.
Member: lithov
lithov Jul 19, 2022 at 10:57:15 (UTC)
Goto Top
ja sorry jetzt hab ich auch kapiert.

Kann ich das irgendwie noch loggen lassen?, bzw. es rast so schnell durch und kommt nichts auf dem FTP an. eigentlich sollte da diese Datei $csvfile_out = 'E:\daten_neu.csv'
entstehen oder wird die durch den Upload dann wieder gelöscht?

Ich wollte jetzt nur den Fehler finden, bzw. ob es an meinen Zugangsdaten des FTP liegt. Aber eigentlich wäre es schön auch die ausgegebene Datei zu sehen.
Member: colinardo
colinardo Jul 19, 2022 updated at 11:11:32 (UTC)
Goto Top
Zitat von @lithov:
Kann ich das irgendwie noch loggen lassen?, bzw. es rast so schnell durch und kommt nichts auf dem FTP an.
Start-Transcript
Oder mittels
powershell -EP Bypass -NoExit -F "D:\script.ps1"  
starten.
Oder am Ende ein
Read-Host
einfügen. Möglichkeiten sind hier vielfältig. => Powershell Leitfaden für Anfänger
eigentlich sollte da diese Datei $csvfile_out = 'E:\daten_neu.csv'
Jepp, aber nur lokal, Remote remote wird die Datei so benannt wie du es in der URL angibst, die URL-Angabe muss also Pfad und Dateinamen enthalten!
entstehen oder wird die durch den Upload dann wieder gelöscht?
eventuell bestehende Dateien werden auf dem FTP ersetzt.
Ich wollte jetzt nur den Fehler finden, bzw. ob es an meinen Zugangsdaten des FTP liegt. Aber eigentlich wäre es schön auch die ausgegebene Datei zu sehen.
Wie gesagt, das obige geht nur mit reinem plain FTP, willst du Verschlüsselung, muss es umgeschrieben werden (bspw. mit der WinSCP Bibliothek)...
Wie man sowas mit WinSCP macht kannst du übrigens hier nachlesen
Script um Dateien zu verschieben und mail zu generieren
Member: lithov
lithov Jul 19, 2022 at 13:13:04 (UTC)
Goto Top
Also es klappt soweit Vielen Dank für die Geduld mit einem absoluten Neuling. lediglich die ausgegeben Datei stellt die Umlaute nicht richtig dar.

Der Ausgang war eine UTF8
Das Ergebnis ist grün statt grün. und andere Umlaute in eine Spalte Beschreibung werden zu: �
Kann man da noch was machen??
Member: colinardo
colinardo Jul 19, 2022 updated at 13:52:28 (UTC)
Goto Top
Zitat von @lithov:

Also es klappt soweit Vielen Dank für die Geduld mit einem absoluten Neuling. lediglich die ausgegeben Datei stellt die Umlaute nicht richtig dar.

Der Ausgang war eine UTF8
Das Ergebnis ist grün statt grün. und andere Umlaute in eine Spalte Beschreibung werden zu: �
Kann man da noch was machen??

Du musst das Encoding der CSV beim Import richtig angeben, PowerShell erkennt das nur richtig von selbst wenn das CSV File ein BOM hat wenn nicht muss das Encoding angegeben werden.
Beispiel für UTF8
$csv = Import-Csv $csvfile_in -Delimiter ";" -Encoding UTF8  
Fur Codepage 1252 dann "Default" usw. ...
Member: lithov
lithov Jul 19, 2022 at 13:52:08 (UTC)
Goto Top
Ok sorry mein Fehler, bzw. habs gefunden. Erster export aus der DB zur Ursprungsdatei war ANSI. Geändert auf UTF8.
und einmal die Script date in notepad aufgemacht hatte die anderen Umlaute ergeben.
Alles über die Powershell bearbeitet und gut war's
Auch der FTP tut mittlerweile! Also Bombe! Klasse!

Wem darf ich wo was spenden?
Member: colinardo
colinardo Jul 19, 2022 updated at 14:00:01 (UTC)
Goto Top
👍 Merci.