Jump to content

PS Import-Csv und Export-Csv


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo MCSE-Team,

 

ich möchte eine CSV-Datei einzelner Spalten separieren.

IST und SOLL wie folgt:

IST Import-CSV:

100-1001;1234;101;MM;;;10.05.2020;;;

100-1002;1234;101;MM;;;1.11.2019;;;

 

SOLL Export-CSV:

100-1001;1234;101;MM;;;20200510;;001;

100-1002;1234;101;MM;;;20191101;;001;

 

Die Änderung soll in der 7.Spalte YYYYMMDD und 9.Spalte ein Default-Wert ausgeführt werden.

 

Aktuelles Skript:

$in_file = "D:\Daten\qsys\Powershell\NC_PM\NC_PM.csv"

$out_file = "D:\Daten\qsys\Powershell\NC_PM\NC_PM_OUT.csv"

$list = Import-Csv $in_file -Delimiter ";" -Header "szIdentNr", "szGeraeteNr", "sGrpNr", "szBezeichnung", "sKlassifizierung", "sPruefOrtBez", "dtPruefTermin", "dtLastPruefTermin", "dwMaxMessungen"

Get-Process | Select-Object -First 5 | Foreach-Object {    

$list | Export-CSV -Path $out_file -NoTypeInformation

}

 

Kann mich jemand unterstützen?

 

VG

Werner

 

Link zu diesem Kommentar

Ich finde, Du hast ein Talent zu verwirren ... was soll das mit dem "Get-Process | Select ..."  und so weiter? Hast Du da versehentlich beim Kopieren das Falsche markiert?  ;-) 

 

Hier ... so sollte's klappen

$in_file = "D:\Daten\qsys\Powershell\NC_PM\NC_PM.csv"
$out_file = "D:\Daten\qsys\Powershell\NC_PM\NC_PM_OUT.csv"
$Header = @(
    'szIdentNr', 
    'szGeraeteNr', 
    'sGrpNr', 
    'szBezeichnung', 
    'sKlassifizierung', 
    'sPruefOrtBez', 
    'dtPruefTermin', 
    'dtLastPruefTermin', 
    'dwMaxMessungen'
)
    Import-Csv $in_file -Delimiter ';' -Header $Header |
        Select-Object -Property 'szIdentNr', 
                                'szGeraeteNr', 
                                'sGrpNr', 
                                'szBezeichnung', 
                                'sKlassifizierung', 
                                'sPruefOrtBez', 
                                @{
                                Name       = 'dtPruefTermin';
                                Expression = { (Get-Date $_.dtPruefTermin -Format 'yyyyMMdd')}
                                },
                                'dtLastPruefTermin', 
                                @{
                                    Name = 'dwMaxMessungen';
                                    Expression = {'DefaultWert'}
                                }| 
                                    Export-CSV -Path $out_file -NoTypeInformation

Ergänzung:  Du solltest jeweils für die cmdlets, die Du benutzt, die Hilfe lesen - komplett und inklusive der Beispiele.  Die Technik, die in diesem Code-Snippet benutzt wird nennt sich "calculated Properties". Einen ersten kleinen Hinweis darauf findest Du in der Hilfe für das cmdlet Select-Object im Beispiel #10. Dabei übergibst Du statt eines einfachen Strings, eine Hash-Table mit einem Stück Code, der die Property errechnet.

bearbeitet von BOfH_666
Link zu diesem Kommentar
vor 1 Stunde schrieb wmessmer:

Sieht ganz gut aus, jedoch benötige ich die Export-Datei ohne Spaltenname (erste Zeile) bzw. Anführungszeichen und der Trenner sollte ; sein.

Das mit dem "Trenner" ist einfach und das bekommst Du allein raus, wenn Du Dir einfach die Hilfe für Export-Csv anguckst.  Wenn Du die Header weglassen willst und auch noch die Anführungszeichen, musst Du halt tricksen. standardkonformes CSV enthält nun mal beides und alle Tools, die standardkonformes CSV korrekt verarbeiten, können damit umgehen. Wofür brauchst Du die Daten denn so komisch?

vor 1 Stunde schrieb wmessmer:

Kann dies auch mit Out-File gemacht werden?

Ja, aber dann musst Du Dich eben um die entsprechende Formatierung selbst kümmern. Ich würde empfehlen, so standardkonform zu arbeiten wie es irgend geht. Alles andere ist üblicherweise aufwändiger, fehlerträchtiger und schwerer zu warten und anzupassen, falls mal nötig.   Wenn Du's doch unbedingt so machen willst, schau Dir mal ConvertTo-Csv an.  ;-)

Link zu diesem Kommentar

Hallo BOfH_666,

 

die Anführungszeichen und den Trenner habe ich jetzt so wie es sein soll.

Die Daten werden über ein Schnittstellentool eingelesen.

Wenn in der ersten Zeile die Spalten drin stehen läuft die Schnittstelle auf Fehler.

 

Da gibt es noch den Parameter -Skip.

Leider fehlt mir das KnowHow für das einbauen in das Objekt.

 

Kannst du mich bitte nochmal unterstützen.

 

VG

Werner

Link zu diesem Kommentar
vor 30 Minuten schrieb wmessmer:

die Anführungszeichen und den Trenner habe ich jetzt so wie es sein soll.

Super. Wie hast Du's gemacht?  :shock2:

Zitat

Die Daten werden über ein Schnittstellentool eingelesen.

Aha. :eye2:

Zitat

Wenn in der ersten Zeile die Spalten drin stehen läuft die Schnittstelle auf Fehler.

Hmmm ... das ist ja nicht gerade sehr robust. Ich würd mich wohl mit dem Anbieter der Schnittstelle auseinandersetzen wollen. Warum toleriert man denn so eine Gängelei?  :shock:

Zitat

Da gibt es noch den Parameter -Skip.

Wo? ;-) 

Zitat

Leider fehlt mir das KnowHow für das einbauen in das Objekt.

 

Kannst du mich bitte nochmal unterstützen.

Da ich Deinen Bildschirm nicht sehen und nicht weiß, was und wie Du's gemacht hast, musst Du jetzt mir helfen, Dir zu helfen. Und Du hilfst damit vielleicht auch anderen, die ein ähnliches Problem haben.  Also zeig mal Deinen Code, wie Du ihn jetzt hast.  :grin3:

bearbeitet von BOfH_666
Link zu diesem Kommentar

Anbei der aktuelle Code:

 

$Header = @(
    'szIdentNr',
    'szGeraeteNr',
    'sGrpNr',
    'szBezeichnung',
    'sKlassifizierung',
    'sPruefOrtBez',
    'dtPruefTermin',
    'dtLastPruefTermin',
    'dwMaxMessungen'
)

Import-Csv $in_file -Delimiter ';' -Header $Header |
        Select-Object -Property 'szIdentNr',
                                'szGeraeteNr',
                                'sGrpNr',
                                'szBezeichnung',
                                'sKlassifizierung',
                                'sPruefOrtBez',
                                @{
                                Name       = 'dtPruefTermin';
                                Expression = { (Get-Date $_.dtPruefTermin -Format 'yyyyMMdd')}
                                },
                                'dtLastPruefTermin',
                                @{
                                    Name = 'dwMaxMessungen';
                                    Expression = {'DefaultWert'}
                                }|
                                  Export-CSV -Path $outtxt_file -Skip 1 -NoTypeInformation -Delimiter ";"
cat $outtxt_file |  %{$_ -replace "`"",""} > $outdat_file

sorry, ohne Skip

 

Korrekte Zeile:

                                  Export-CSV -Path $outtxt_file -NoTypeInformation -Delimiter ";"
 

Link zu diesem Kommentar

Hmmm ... ich empfehle Dir dringeds, DIr die Grundlagen von Powershell anzueignen. Solltest Du vorhaben, beruflich noch ne Weile in Windows-Umgebungen unterwegs zu sein, lohnt sich das für die Zukunft auf jeden Fall für Dich.

 

Hier im Forum bitte Code als Code formatieren.

Und bitte in Skripten und in Foren keine Aliasse verwenden. Hier also die nächste Literaturempfehlung: The Unofficial PowerShell Best Practices and Style Guide.

Wenn Du die Hilfe für Export-Csv gelesen hättest, hättest Du gewusst, dass dieses cmdlet keinen Parameter -Skip hat.

$in_file = "D:\Daten\qsys\Powershell\NC_PM\NC_PM.csv"
$out_file = "D:\Daten\qsys\Powershell\NC_PM\NC_PM_OUT.csv"
$Header = @(
    'szIdentNr', 
    'szGeraeteNr', 
    'sGrpNr', 
    'szBezeichnung', 
    'sKlassifizierung', 
    'sPruefOrtBez', 
    'dtPruefTermin', 
    'dtLastPruefTermin', 
    'dwMaxMessungen'
)
Import-Csv $in_file -Delimiter ';' -Header $Header |
    Select-Object -Property 'szIdentNr', 
                            'szGeraeteNr', 
                            'sGrpNr', 
                            'szBezeichnung', 
                            'sKlassifizierung', 
                            'sPruefOrtBez', 
                            @{
                                Name       = 'dtPruefTermin';
                                Expression = { (Get-Date $_.dtPruefTermin -Format 'yyyyMMdd') }
                            },
                            'dtLastPruefTermin', 
                            @{
                                Name       = 'dwMaxMessungen';
                                Expression = { 'DefaultWert' }
                            } | 
                                ConvertTo-Csv -NoTypeInformation -Delimiter ';' |
                                    ForEach-Object {
                                        $_ -replace '"'
                                    } | 
                                        Select-Object -Skip 1 |
                                            Out-File $out_file

 

bearbeitet von BOfH_666
Link zu diesem Kommentar

Hat jetzt super funktioniert.

Herzlichen Dank für Deine Unterstützung.

vor 13 Stunden schrieb BOfH_666:

Hmmm ... ich empfehle Dir dringeds, DIr die Grundlagen von Powershell anzueignen. Solltest Du vorhaben, beruflich noch ne Weile in Windows-Umgebungen unterwegs zu sein, lohnt sich das für die Zukunft auf jeden Fall für Dich.

 

Hatte jetzt mal eine Anforderung, bin sonst mit AWK unterwegs.
...denke aber das ich PS langfristig benötige.

 

vor 13 Stunden schrieb BOfH_666:

Hier im Forum bitte Code als Code formatieren.

Was meinst du genau mit formatieren?

Meinst du das einrücken des Codes?

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...