none
Collection in Array kopieren RRS feed

  • Frage

  • Hallo,

    Vielleicht hat jemand einen Tipp für mich:

    Ich habe eine Collection mit gut 100.000 Elementen, die ich in ein Array kopieren möchte

    Lt. MSDN müsste das irgendwie so in der Art funktionieren

    http://msdn.microsoft.com/de-de/library/system.collections.specialized.stringcollection.copyto%28v=vs.110%29.aspx

    $Collection = New-Object System.Collections.Specialized.StringCollection
     $Null = $Collection.Add("test0") 
     $Null = $Collection.Add("test1") 
     $Null = $Collection.Add("test2") 
    
     $MyArray = @()
     $Collection.count
    
     $Collection.CopyTo($myArray,0)
    
     $myArray

    Ich bekomme allerdings nur den Fehler, dass das Array nicht groß genug wäre. Ich habe schon einiges probiert ein Array der entsprechenden Länge vorab zu definieren, ohne Erfolg.

    Ziel ist es, alle Collection-Elemente in eine csv-Datei zu schreiben. Aber aus Performancegründen nicht  Zeile für Zeile mit Foreach etc., sondern in einem Stück als Array

    Danke Euch

    Kai


    • Bearbeitet Yorck Kai Freitag, 21. März 2014 12:55
    Freitag, 21. März 2014 12:52

Antworten

Alle Antworten

  • Geht dies nicht:

    $MyArray = @($Collection)

    ?

    Freitag, 21. März 2014 13:11
  • nein, leider nicht.

    $Myarray wird dadurch kein Array, sondern nur ein mit Leerzeichen getrennter String

    Freitag, 21. März 2014 16:29
  • Danke, ich habs jetzt selbst hinbekommen,

    mit Gewalt :-)

    $Collection = New-Object System.Collections.Specialized.StringCollection
     $Null = $Collection.Add("bla") 
     $Null = $Collection.Add("test") 
     $Null = $Collection.Add("test2") 
    
     [Array]$myArray = $Collection
     Out-File -inputobject $myArray -FilePath "c:\temp\text.csv"

    Danke Dir trotzdem!

    Kai

    Freitag, 21. März 2014 17:14
  • Hallo Kai

    Es gibt in der PowerShell Cmdlets die Extra dafür gemacht sind CSV Dateien zu verarbeiten und zu erstellen.

    ConvertFrom-Csv
    ConvertTo-Csv
    Export-Csv
    Import-Csv

    Wenn jemand in der PowerShell CSV sagt dann gehen wir davon aus das diese Cmdlets benutzt werden sollen.

    Out-File erstellt Textdateien keine echten CSV-Dateien.

    Das CSV Format erzwingt zwar keine Header zeile für eine CSV Datei, doch PowerShell benötigt eine Header Zeile um eine Datei als CSV einzulesen.

    Mit Outfile ertellst du eine Textdatei mit nur jeweils einem Wort in jeder Zeile ohne Header Zeile. Also aus sicht von powerShell ist das keine CSV Datei, da der Header fehlt.

    Die Klammer mit dem At-Zeichen @() erzeugt genauso wie der Accelerator [Array] ein dummes PowerShell Array vom Typ System.Object[].

    Die Antwort von PowerTurtle ist also richtig!

    Ich habe nun mehrere, folgende, Code varianten durch probiert, alle liefern das selbe von dir gewünschte Ergebnis:

    Ohne wandluung in ein Array geht es auch!

    $Collection = New-Object System.Collections.Specialized.StringCollection
    $Null = $Collection.Add("bla") 
    $Null = $Collection.Add("test") 
    $Null = $Collection.Add("test2") 
     
    Out-File -inputobject $Collection -FilePath "D:\temp\text.csv"
    
    Notepad "D:\temp\text.csv"


    Wandlung in ein Array:

    $Collection = New-Object System.Collections.Specialized.StringCollection
    $Null = $Collection.Add("bla") 
    $Null = $Collection.Add("test") 
    $Null = $Collection.Add("test2") 
     
    Out-File -inputobject @($Collection) -FilePath "D:\temp\text.csv"
    
    Notepad "D:\temp\text.csv"

    oder so Hier müssen Klammenr gesetzt werden!:

    $Collection = New-Object System.Collections.Specialized.StringCollection
    $Null = $Collection.Add("bla") 
    $Null = $Collection.Add("test") 
    $Null = $Collection.Add("test2") 
     
    Out-File -inputobject ([Array]$Collection) -FilePath "D:\temp\text.csv"
    
    Notepad "D:\temp\text.csv"


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Samstag, 22. März 2014 14:30
  • Hallo Peter,

    Vielen Dank für deine Mühe.

    Die einzelnen Zeilen der Collection bestehen bei mir bereits aus kommaseparierten Einträgen, die ich in eine Textdatei reinschieben muss. Das habe ich gestern -warum auch immer- direkt trotz vieler Versuche nicht hinbekommen, daher der Umwegversuch über das Array

    Mit deinen Beispielen klappts auf jeden Fall einwandfrei und ganz ohne Array :-).

    Super!

    Vielen Dank

    Kai

    Montag, 24. März 2014 22:17