Jump to content

powershell Variable in Array


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

Empfohlene Beiträge

Guten Tag und ein "frohes, neues jahr" zusammen.

Ich habe ein Problem, bei dem ich gedacht habe, dass das eigentlich ein "Klax" sein müsste- ich hänge aber jetzt schon seit 2 Stunden daran, ohne wirklich weiter zu kommen:

Ich habe eine CSV-Datei (erstellt aus einer Excel Arbeitsmappe), aus der ich einige Daten in ein Array schieben möchte (ich brauche also alle Zeilen, ab Zeile 6). Diese CSV sieht so aus:

 

in den ersten 5 Zeilen

dieser CSV-Datei steht ausschliessslich

Datenmüll, der aus der Datei

herausgeschnitten werden soll!

zum Beispiel die Überschrift aus der Excel Datei, aus der diese CSV entstanden ist

Schmitz;Harald;Schmitz@zuHause.de;123456;

;Heiner;;234567;

Müller;;Mueller@zuHause.de;;

Maier;Susanne;;456789

;;;;;;;;;;;;;;

 

 

Da diese Datei keinen brauchbaren Header hat, will ich mir den selber erstellen . Dazu lese ich die o.g. Datei ab Zeile 6 ein

$csvContent = Get-Content  C:\temp\Test.csv | select -skip 5

..erstelle mir meinen Header

$csvHeader = 'Nachname;Vorname;Email;PersonalNummer'

....setze mir daraus eine Variable zusammen und speicher diese als CSV-Datei wieder ab

$xyz=$csvHeader,$csvContent  >  C:\temp\Test2.csv

....nun lese ich diese neue Datei in ein Array wieder ein

$ergebnis = @(import-csv -path  C:\temp\Test2.csv -delimiter ";" -encoding utf8 )

...und kann dieses auch abfragen. 

$ergebnis[1]

$ergebnis[1].Personalnummer

Das funktioniert einwandfrei!

 

Mein Problem ist, dass ich es mir sparen möchte, den Inhalt von $xyz als csv abzuspeichern und neu einzulesen. Aber jeder Versuch, das zu umgehen scheitert irgendwie kläglich.

Hat da jemand eine Idee, wie ich da vorgehen muss?

 

vielen Dank

Holgw

 

 

Link zu diesem Kommentar
vor einer Stunde schrieb newbi2009:

erstellt aus einer Excel Arbeitsmappe

Es gibt ein Modul, mit dem Du Excel-Dateien direkt verarbeiten kannst: ImportExcel. Das macht die Sache eventuell leichter.

 

vor einer Stunde schrieb newbi2009:

Da diese Datei keinen brauchbaren Header hat, will ich mir den selber erstellen .

Dafür gibt es beim cmdlet Import-Csv den Parameter -Header, mit dem man eigene Header hinzufügen kann.

 

vor einer Stunde schrieb newbi2009:

Mein Problem ist, dass ich es mir sparen möchte, den Inhalt von $xyz als csv abzuspeichern und neu einzulesen. Aber jeder Versuch, das zu umgehen scheitert irgendwie kläglich.

Hat da jemand eine Idee, wie ich da vorgehen muss?

Ja ... quasi oben alles beantwortet ...   ;-)

 

Ach übrigens, wenn Du Code postest, diesen am Besten auch als Code formatieren (das ist der Button "</>" oben im Editor) 

bearbeitet von BOfH_666
Link zu diesem Kommentar
vor einer Stunde schrieb NilsK:

Moin,

 

stellen wir das Ganze doch mal auf die Füße: Was hast du denn insgesamt vor? 

 

Gruß, Nils

 

Hi Nils,

Ich habe immer wieder Excel-Dateien, die den gleichen Aufbau haben. Nur eben unterschiedlich mit Namen, Mail-Adresse, etc... befüllt. Diese werden mir als csv-Datei abgespeichert zur Verfügung gestellt. Hier sind halt die ersten paar Zeilen immer Datenmüll. Ich möchte die Zeilen, die die Benutzer-Informationen (in der csv immer ab Zeile 6) also weiterverarbeiten. Dazu möchte ich diese in einem mehrdimensionalen Array haben, damit ich ich für jeden Benutzer die einzelnen Daten explizit ansprechen kann (z.b. Mailadresse von Benutzer aus Zeile 7 => $ergebnis[2].Email)

 

Quasi genau so, wie ich es habe, wenn ich den Zwischenschritt mit der zweiten csv Datei, die ich abspecihere und wieder einlese, habe.

Halt nur, ohne den Umweg eine neue Datei abzulegen und wieder einzulesen....

 

Danke und Gruß

Holger

 

vor 52 Minuten schrieb BOfH_666:

Es gibt ein Modul, mit dem Du Excel-Dateien direkt verarbeiten kannst: ImportExcel. Das macht die Sache eventuell leichter.

 

Dafür gibt es beim cmdlet Import-Csv den Parameter -Header, mit dem man eigene Header hinzufügen kann.

 

Ja ... quasi oben alles beantwortet ...   ;-)

 

Ach übrigens, wenn Du Code postest, diesen am Besten auch als Code formatieren (das ist der Button "</>" oben im Editor) 

Hallo BOfH_666,

 

danke für Deine Antwort. Das ImportExcel-Modul schaue ich mir einmal genauer an. Dankefür den Tipp!

 

Allerdings bringt mir das cmdlet Import-Csv nicht so viel. Ich habe ja eine Variable ($xyz) in die ich meinen selbstgebauten Header und die nötigen "Daten-Zeilen" aus der ursprünglichen csv Datei gelegt habe....... 

Ich bekomme es aber nicht hin, diese Variable als Array zu benutzen. Ich muss zuerst den Inhalt der Variable in eine Datei abspecihern und DANN mit import-csv diese neue Datei wieder einlesen (der Inhalt der abgespeciherten csv Datei ist ja genauso, wie ich es brauche..... nur bekomme ich diesen halt nicht in ein Array)

 

Danke und Gruß

Holger

Link zu diesem Kommentar

Moin,

 

aha, es handelt sich also um eine wiederkehrende Aufgabe mit wechselnden Daten? Was geschieht damit, d.h. in welcher Art verarbeitest du das weiter?

Bekommst du die CSVs direkt oder erzeugst du die selbst? Falls du die CSVs bekommst, könntest du auch die Excels direkt erhalten?

 

Hintergrund der Fragen: Wenn wir wissen, welche Aufgabe du eigentlich lösen musst, können wir dir vielleicht besser helfen. Wir erleben immer wieder, dass wir ein Detailproblem mit jemandem lösen und hinterher feststellen, dass es viel leichter wäre, die tatsächliche Aufgabe ganz anders anzugehen.

 

Gruß, Nils

 

Link zu diesem Kommentar
vor 10 Minuten schrieb NilsK:

Moin,

 

aha, es handelt sich also um eine wiederkehrende Aufgabe mit wechselnden Daten? Was geschieht damit, d.h. in welcher Art verarbeitest du das weiter?

Bekommst du die CSVs direkt oder erzeugst du die selbst? Falls du die CSVs bekommst, könntest du auch die Excels direkt erhalten?

 

Hintergrund der Fragen: Wenn wir wissen, welche Aufgabe du eigentlich lösen musst, können wir dir vielleicht besser helfen. Wir erleben immer wieder, dass wir ein Detailproblem mit jemandem lösen und hinterher feststellen, dass es viel leichter wäre, die tatsächliche Aufgabe ganz anders anzugehen.

 

Gruß, Nils

 

Hi Nils,

ja, ich könnte auch die Excel-Datei bekommen. Das ist kein Problem.

Was ich damit weiter vorhabe ist nicht ganz einfach zu erklären und da werde ich wohl auch noch lange dran sitzen, bis ich das hinbekomme.

Im Endeffekt muss ich die Daten, die in der Excel geliefert werden herausfiltern und damit existierende Benutzer-Daten auf einem Oracle-LDAP-Server updaten.

Sprich: Benutzer x soll ein bestimmtes Flag auf dem LDAP Server gesetzt bekommen. Das mache ich bisher alles "zu Fuß". Es kommt aber vor, dass Excel-Tabellen mit 60 oder mehr Benutzern reinkommen, bei denen manuell unterschiedliche Flags gesetzt werden müssen, oder diese in unterschiedlioche Gruppen aufgenommen werden müssen.....

Das möchte ich so weit automatisieren, wie es mir möglich ist....

 

Lange Rede, kurzer Sinn: Es wäre mir tatsächlich schon mega geholfen, wenn Ihr mir bei meinem ursprünglichen Problem helfen könntet.... Es werden bestimmt beim Entwickeln noch genug andere Probleme auftauchen, die ich ich jetzt noch nicht absehen kann :-)

 

Danke und Gruß

Holger 

Link zu diesem Kommentar

 

OK.... also prinzipiell bin ich absolut bei Nils. Wir haben hier schon öfters an Lösung von hinten durch die Brust ins Auge gebaut, die aber für die eigentlich zu lösende Aufgabe völlig unnötig waren.

 

Davon unabhängig:

vor 26 Minuten schrieb newbi2009:

Allerdings bringt mir das cmdlet Import-Csv nicht so viel. Ich habe ja eine Variable ($xyz) in die ich meinen selbstgebauten Header und die nötigen "Daten-Zeilen" aus der ursprünglichen csv Datei gelegt habe....... 

 

Du kannst Dir doch das ganze Geraffel sparen, wenn Du die aus Deiner Excel-Datei erzeugte CSV-Datei, die ja keine Header hat, ganz normal mit Import-CSV einliest, dabei mit dem Parameter -Header, die gewünschten Header dazupackst und mit einem Select-Object -Skip 5, die ersten 5 Zeilen auslässt.

Link zu diesem Kommentar

Moin,

 

gut, zu deinem akuten Punkt hat Olaf dir ja schon Hinweise gegeben. Aber deine Schilderung illustriert schön, was ich meine:

 

vor 4 Minuten schrieb newbi2009:

Im Endeffekt muss ich die Daten, die in der Excel geliefert werden herausfiltern und damit existierende Benutzer-Daten auf einem Oracle-LDAP-Server updaten.

Ja, das ist eine typische Anforderung. Als Berater denke ich mir: Wie kommen denn die Daten in das Excel hinein? Wäre es evtl. sinnvoller, diesen Umweg einzusparen und dort, wo bislang das Excel erzeugt wird, gleich direkt das LDAP zu ändern?

 

Vielleicht ist das auch noch nicht der richtige Ansatz, aber du siehst evtl., was ich meine.

 

Gruß, Nils

 

bearbeitet von NilsK
Link zu diesem Kommentar
vor 18 Minuten schrieb BOfH_666:

 

OK.... also prinzipiell bin ich absolut bei Nils. Wir haben hier schon öfters an Lösung von hinten durch die Brust ins Auge gebaut, die aber für die eigentlich zu lösende Aufgabe völlig unnötig waren.

 

Davon unabhängig:

 

Du kannst Dir doch das ganze Geraffel sparen, wenn Du die aus Deiner Excel-Datei erzeugte CSV-Datei, die ja keine Header hat, ganz normal mit Import-CSV einliest, dabei mit dem Parameter -Header, die gewünschten Header dazupackst und mit einem Select-Object -Skip 5, die ersten 5 Zeilen auslässt.

...grundsätzlich ne gute Idee, hätte ich auch selber drauf kommen können :-) Aber so richtig funktionieren tut das auch nicht

$abc = @(import-csv -path C:\temp\Test.csv  -Header 'Nachname;Vorname;Email;PersonalNummer' | Select-Object -skip 5)

ein 

$abc

bringt dann auch das gewünschte Ergebnis:

Nachname;Vorname;Email;PersonalNummer    
-------------------------------------    
Schmitz;Harald;Schmitz@zuHause.de;123456;
;Heiner;;234567;                         
Müller;;Mueller@zuHause.de;;             
Maier;Susanne;;456789                    
;;;;;;;;;;;;;;                           
Müller;;Mueller@zuHause.de;;  

auch ein 

$abc[2]

bringt das gewünschte Ergebnis

Nachname;Vorname;Email;PersonalNummer
-------------------------------------
Müller;;Mueller@zuHause.de;; 

allerdings liefert ein

$abc[2].Email

kein Ergebnis ?!

Was mache ich denn hier falsch?

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...