Jump to content
Sign in to follow this  
wmessmer

PS Import-Csv und Export-Csv

Recommended Posts

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

 

Share this post


Link to post

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.

Edited by BOfH_666

Share this post


Link to post

Danke für die schnelle Hilfe.

Meine Verwirrung hat eher mit "copy-paste-keine-Ahnung" zu tun :-(

 

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

 

Kann dies auch mit Out-File gemacht werden?

 

Share this post


Link to post
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.  ;-)

Share this post


Link to post

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

Share this post


Link to post
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:

Edited by BOfH_666

Share this post


Link to post

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 ";"
 

Share this post


Link to post

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

 

Edited by BOfH_666

Share this post


Link to post

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?

Share this post


Link to post
vor einer Stunde schrieb wmessmer:

Was meinst du genau mit formatieren?

Du markierst den Code den Du in einen Beitrag eingefügt hast und klickst dann einfach in der Formatierungsleiste auf </> .

vor einer Stunde schrieb wmessmer:

bin sonst mit AWK unterwegs.

AWK? Dieses AWK -> https://de.wikipedia.org/wiki/Awk  ??

Share this post


Link to post
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Werbepartner:



×
×
  • Create New...