none
Warum läuft mein Programm ewig? RRS feed

  • Frage

  • Hallo,

    ich will in meinem Programm zwei Dateien miteinander verbinden anhand einer ID die in beiden Dateien vorkommt.

    Ich gehe also duch Datei1 und hole mir aus jeder Zeile die ID, dasselbe mache ich mit Datei2, ich sage WENN ID1 = ID2 dann schreibe ich die Tabellenzeile mit den Daten aus Datei1 plus den Daten aus Datei2, ansonsten schreibe ich die Daten aus Datei1  unverändert in die neue Tabelle.

    Datei1 hat 3350 Zeilen, Datei2 hat 559 Zeilen, ich habe einen Zähler eingefügt , der ausgegeben wird um zu sehen bei welcher Zeile das Programm ist ... so wie es aussieht kann ich ein Paar Tage warten .... ODER weiß jemand Rat?

    Danke

     #Pfadangabe
    $pfad = "D:\NEYELOFF"
    #Import Datei Vera
    $importVera = Get-Content "$pfad\SDB_40m_2014_12_23_modi.csv " -Encoding "UTF8"
    $ImportManuel = Get-Content "$pfad\rNIHSS_komplett.csv " -Encoding "UTF8"
    #echo $importManuel
    $del = ";"
    $neuetab = @()
    $Zähl=0
    $neuetab= "ID_a;AUFNAHMEDATUM_a;PATIENTNO;GEBURTSDATUM_a;Geschlecht_a;Studie_a;Studie_vz;StudieCode_a;preanemia;anem_gr;Thyroid;obese;Grund_2;Grund_code;Grund_code_vz;Patientenrecherche_Mareike;B_FALLNUMMER;MI;SYMPTOMBEGINNFESTLEGUNG;SYMPTOMBEGINNDATUM;DiffK_A;HAUPTDIAGNOSEKATEGORIE;HAUPTDIAGNOSE;KHK_a;PAVK_a;SCHLAGANFALL_a;ERSTERSCHLAGANFALL;VHF;VORERKRANKUNGEN;RANKIN1_a;ACE_HEMMER_a;AT1ANTAGONIST_a;BETABLOCKER_a;CAANTAGONIST;DIURETIKUM;hypermed;STATIN;BERUF;SCHULABSCHLUSS;KOMMENTAR;ASS100;ASS300;ASS;CLOPIDOGREL;ASSDIAPYRIDAMOL;MARCUMAR;LMWHEPARIN;anticoamed;ANTIHYPERTENSIVA;INSULINTHERAPIE;ORALEANTIDIABETIKA;diabmed;BERFASSUNGSDATUM;B_LETZTEAENDERUNG;HYPERTONIE_a;HYPERCHOLESTERINAEMIE_a;DIABETES_a;HYPERLIPIDAEMIE_a;NIKOTIN_a;NIKOTINMENGEPROTAG;NIKOTINZEIT;ALKOHOL;FASCHLAGANFALL;FAHERZINFARKT_a;HORMONE;KOERPERGROESSE_a;GEWICHT_a;C_ERFASSUNGSDATUM;C_LETZTEAENDERUNG;GCS_AUGENOEFFNUNG;GCS_SPRACHE;GCS_MOTORIK;GCS;VERWIRRTHEITSZUSTAND_a;DEMENZ_a;MENINGISMUS;DYSPHAGIE;ZOMST;AUFNAHME_UNTERSUCHUNGSBEFUND;D_ERFASSUNGSDATUM;D_LETZTEAENDERUNG;A_01A_BEWUSSTSEIN;A_01A_BEWUSSTSEIN_ML;A_01B_FRAGEN;A_01B_FRAGEN_ML;A_01C_AUFFORDERUNGEN;A_01C_AUFFORDERUNGEN_ML;A_02_BLICKBEWEGUNGEN;A_02_BLICKBEWEGUNGEN_ML;A_03_GESICHTSFELD;A_03_GESICHTSFELD_ML;A_04_FAZIALISPARESE;A_04_FAZIALISPARESE_ML;A_05_MOT_ARME;A_05_MOT_ARME_ML;A_06_MOT_BEINE;A_06_MOT_BEINE_ML;A_05_MOT_ARMER;A_05_MOT_ARMER_ML;A_06_MOT_BEINER;A_06_MOT_BEINER_ML;A_07_ATAXIE;A_07_ATAXIE_ML;A_08_SENSIBILITAET;A_08_SENSIBILITAET_ML;A_09_APHASIE;A_09_APHASIE_ML;A_10_DYSARTHRIE;A_10_DYSARTHRIE_ML;A_11_NEGLECT;A_11_NEGLECT_ML;Nihss_Sum;Nihss_Sum_ML;AlterTage;AlterJahre; nihss_vz;Diagkat;finalND;reason;;;;;;;;;;;`n"
    #Datei Vera durchgehen
    for ($h=1; $h -lt $ImportVera.length; $h++){
                $CurrentDAT_Vera = $importVera[$h].split($del)
                $CurrentDAT_Vera_ID = $CurrentDAT_Vera[16]
                
                if ($CurrentDAT_Vera_ID.length -gt 8){
                   $CurrentDAT_Vera_ID=$CurrentDAT_Vera_ID.Substring(2)
                }
            for ($a=0; $a -le $ImportManuel.length; $a++){
            
                $CurrentDAT_Man = $ImportManuel[$a].split($del)
                $CurrentDAT_Man_ID = $CurrentDAT_Man[0]
          
                     if ($CurrentDAT_Vera_ID  -eq $CurrentDAT_Man_ID){  
                           
                           for ($m=0; $m -le 80; $m++) {
                                $neuetab += $CurrentDAT_Vera[$m] 
                                $neuetab += $del
                           }
                           $neuetab += $CurrentDAT_Vera[81] 
                           $neuetab += $del                      
                           $neuetab += $CurrentDAT_Man[1] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Vera[82] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Man[2] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Vera[83] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Man[3] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Vera[84] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Man[4] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Vera[85] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Man[5] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Vera[86] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Man[6] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Vera[87] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Man[7] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Vera[88] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Man[8] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Vera[89] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Man[9] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Vera[90] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Man[10] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Vera[91] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Man[11] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Vera[92] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Man[12] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Vera[93] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Man[13] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Vera[94] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Man[14] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Vera[95] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Man[15] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Vera[96] 
                           $neuetab += $del
                           $neuetab += $CurrentDAT_Man[16] 
                           $neuetab += $del              
                         
                           for ($n=97; $n -le 102; $n++) {
                                $neuetab += $CurrentDAT_Vera[$n] 
                                $neuetab += $del
                           }
                           
                      }elseif($CurrentDAT_Vera_ID  -ne $CurrentDAT_Man_ID){ 
                                               
                           for ($o=0; $o -le 102; $o++) {
                                $neuetab += $CurrentDAT_Vera[$o] 
                                $neuetab += $del
                           }     
                 }    
            }
            $Zähl=$Zähl+1
            echo $Zähl    
     }   
     
    #echo $neuetab        
                
    $neuetab | Out-File $pfad\'NEU.csv' -Encoding UTF8   

    Mittwoch, 7. Januar 2015 15:39

Antworten

  • Hallo Peter,

    ok, Import CSV habe ich eingebaut. :-)

    Nur wie kann ich das Programm verbessern? Lässt sich die Abfrage die ich haben will denn über ForEach oder ein Where-Object lösen?

    VG

    Ja natürlich!
    Auch die Pipeline Arbeitet ähnlich wie ein ForEach.

    Wie in dem Artikel erwähnt, ergeben die einzelnen Überschriften der CSV Spalten die Namen der Properties.
    Kannst du die Header der beiden CSV Dateien hier Posten? Die benötigen wir um dir gezielt helfen zu können.

    #Pfadangabe
    $pfad = "D:\NEYELOFF"
    
    Import-CSV -Path "$pfad\SDB_40m_2014_12_23_modi.csv" | ForEach-Object {
        # Das Objekt (die Zeile), das gerade verarbeitet wird,
    	# befindet sich in der automatischen generierten Variable mit dem Namen $_
    
        # Ausgeben des Objektes zur Demonstration
        $_
    }


    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+

    Donnerstag, 8. Januar 2015 09:47
  • Hallo,

    wenn ich das richtig verstehe, willst du mit deinem Code erreichen, das Werte aus der Datei 1 und Werte aus der Datei 2 durch ';' getrennt eine Zeile fuer eine neue Datei bilden sollen, Diese Zeilen stehen in dem Array $neuetab.

    Dein Code erzeugt aber kein multidimensionales Array, sondern mit jeder Zeile die so beginnt $neuetab += $... wird dein Array neu gebaut und um das hinzugefuegte Element ergaenzt, d.h. er schreibt hier nicht in die Zeile sondern in die Spalte.

    d.h. du willst das

    Wert1Datei1;Wert2Datei2;Wert6Datei1;Wert4Datei2

    dein Code produziert das:

    Wert1Datei1
    ;
    Wert2Datei2
    ;
    Wert6Datei1
    ;
    Wert4Datei2

    Und wenn das Array staendig neu gebaut werden muss kostet das viel Resourcen und benotigt somit Zeit.

    Hier ein BeipsileCode das ein Array baut mit den Zahlen von 0-100000, der Code braucht je nach System mehrere Minuten in meinem Fall ueber 8 Minuten.

    # Langsam Array
    Measure-Command {
    	$Array = @()
    	$i = 0
    	do {
    		$Array += "$i" 
    		$i++
    	} until ($i -gt 100000)
    }
    Und hier Code der das gleiche produziert aber nur ein paar Millisekunden braucht.

    # Schnell ArrayList
    Measure-Command {
    	$ArrayList = New-Object System.Collections.ArrayList
    	$i = 0
    	do {
    		$Null = $ArrayList.Add("$i")
    		$i++
    	} until ($i -gt 100000)
    }

    Unterschied ist, dass ich hier ArrayList nutze das deutlich schneller arbeitet.

    Beste Gruesse
    brima

    Donnerstag, 8. Januar 2015 15:29

Alle Antworten

  • Habe gerade noch die Zeilenumbrüche ergänzt ....
    Mittwoch, 7. Januar 2015 15:44
  • Hallo Struppi!

    Es gibt mehrere Grundprinzipien die man in der Windows PowerShell unbedingt beachten und lernen sollte.

    Hier nur die wichtigsten:

    • Windows PowerShell Befehle erzeugen und Verarbeiteten digitale Objekte nicht Text!
    • Ein PowerShell Befehl heißt Cmdlet (sprich Kommand-let).
    • Windows PowerShell nutzt eine Pipeline | um das Ergebnis als einzelne Objekte von einem Cmdlet zum nächsten weiterzugeben.

    Dies ist absolutes PowerShell Grundwissen, das man sich in einem Lehrgang, mit der sehr guten PowerShell Hilfe oder mit einem guten PowerShell Buch aneignen sollte.
    Du findest Buchtipps in meinem Blog und ich habe auf Youtube einige PowerShell Lern-Videos gemacht. (Schau in meine Signatur hier).

    Als ersten schritt, nutze zum Verarbeiten von CSV Dateien das Cmdlet Import-CSV !
    Lies mal meinem kleinen Import-CSV Workshop:
    http://www.admin-source.de/BlogDeu/963/import-csv-workshop


    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+

    Donnerstag, 8. Januar 2015 08:50
  • Hallo Peter,

    ok, Import CSV habe ich eingebaut. :-)

    Nur wie kann ich das Programm verbessern? Lässt sich die Abfrage die ich haben will denn über ForEach oder ein Where-Object lösen?

    VG

    Donnerstag, 8. Januar 2015 09:12
  • Hallo Peter,

    ok, Import CSV habe ich eingebaut. :-)

    Nur wie kann ich das Programm verbessern? Lässt sich die Abfrage die ich haben will denn über ForEach oder ein Where-Object lösen?

    VG

    Ja natürlich!
    Auch die Pipeline Arbeitet ähnlich wie ein ForEach.

    Wie in dem Artikel erwähnt, ergeben die einzelnen Überschriften der CSV Spalten die Namen der Properties.
    Kannst du die Header der beiden CSV Dateien hier Posten? Die benötigen wir um dir gezielt helfen zu können.

    #Pfadangabe
    $pfad = "D:\NEYELOFF"
    
    Import-CSV -Path "$pfad\SDB_40m_2014_12_23_modi.csv" | ForEach-Object {
        # Das Objekt (die Zeile), das gerade verarbeitet wird,
    	# befindet sich in der automatischen generierten Variable mit dem Namen $_
    
        # Ausgeben des Objektes zur Demonstration
        $_
    }


    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+

    Donnerstag, 8. Januar 2015 09:47
  • Hallo, ok

    die kleinere Datei:

    Patienten-ID;Vigilanz;Orientierung;Aufforderungen;Blickbewegungen;Gesichtsfeld;Facialisparese;Motorik Arm L;Motorik Bein L;Motorik Arm R;Motorik Bein R;Ataxie;Sensibilität;Aphasie;Dysarthrie;Neglect;NIHSS

    und die größere

    ID_a;AUFNAHMEDATUM_a;PATIENTNO;GEBURTSDATUM_a;Geschlecht_a;Studie_a;Studie_vz;StudieCode_a;preanemia;anem_gr;Thyroid;obese;Grund_2;Grund_code;Grund_code_vz;Patientenrecherche_Mareike;B_FALLNUMMER;MI;SYMPTOMBEGINNFESTLEGUNG;SYMPTOMBEGINNDATUM;DiffK_A;HAUPTDIAGNOSEKATEGORIE;HAUPTDIAGNOSE;KHK_a;PAVK_a;SCHLAGANFALL_a;ERSTERSCHLAGANFALL;VHF;VORERKRANKUNGEN;RANKIN1_a;ACE_HEMMER_a;AT1ANTAGONIST_a;BETABLOCKER_a;CAANTAGONIST;DIURETIKUM;hypermed;STATIN;BERUF;SCHULABSCHLUSS;KOMMENTAR;ASS100;ASS300;ASS;CLOPIDOGREL;ASSDIAPYRIDAMOL;MARCUMAR;LMWHEPARIN;anticoamed;ANTIHYPERTENSIVA;INSULINTHERAPIE;ORALEANTIDIABETIKA;diabmed;BERFASSUNGSDATUM;B_LETZTEAENDERUNG;HYPERTONIE_a;HYPERCHOLESTERINAEMIE_a;DIABETES_a;HYPERLIPIDAEMIE_a;NIKOTIN_a;NIKOTINMENGEPROTAG;NIKOTINZEIT;ALKOHOL;FASCHLAGANFALL;FAHERZINFARKT_a;HORMONE;KOERPERGROESSE_a;GEWICHT_a;C_ERFASSUNGSDATUM;C_LETZTEAENDERUNG;GCS_AUGENOEFFNUNG;GCS_SPRACHE;GCS_MOTORIK;GCS;VERWIRRTHEITSZUSTAND_a;DEMENZ_a;MENINGISMUS;DYSPHAGIE;ZOMST;AUFNAHME_UNTERSUCHUNGSBEFUND;D_ERFASSUNGSDATUM;D_LETZTEAENDERUNG;A_01A_BEWUSSTSEIN;A_01B_FRAGEN;A_01C_AUFFORDERUNGEN;A_02_BLICKBEWEGUNGEN;A_03_GESICHTSFELD;A_04_FAZIALISPARESE;A_05_MOT_ARME;A_06_MOT_BEINE;A_05_MOT_ARMER;A_06_MOT_BEINER;A_07_ATAXIE;A_08_SENSIBILITAET;A_09_APHASIE;A_10_DYSARTHRIE;A_11_NEGLECT;Nihss_Sum;AlterTage;AlterJahre; nihss_vz;Diagkat;finalND;reason;;;;;;;;;;;

    

    Donnerstag, 8. Januar 2015 09:58
  • Bitte überlege besser, wie man in einem Forum eine Frage so stellt, ohne dass die Helfer herum raten müssen. ;-)

    Hast du den Demo Code mal ausprobiert?

    Was ist die Kleine Datei und die grosse?

    $importVera = Import-CSV "$pfad\SDB_40m_2014_12_23_modi.csv"
    $ImportManuel = Import-CSV "$pfad\rNIHSS_komplett.csv"

    Ich vermute mal $ImportManuel  soll durchlaufen werden?


    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+

    Donnerstag, 8. Januar 2015 11:39
  • Hallo,

    wenn ich das richtig verstehe, willst du mit deinem Code erreichen, das Werte aus der Datei 1 und Werte aus der Datei 2 durch ';' getrennt eine Zeile fuer eine neue Datei bilden sollen, Diese Zeilen stehen in dem Array $neuetab.

    Dein Code erzeugt aber kein multidimensionales Array, sondern mit jeder Zeile die so beginnt $neuetab += $... wird dein Array neu gebaut und um das hinzugefuegte Element ergaenzt, d.h. er schreibt hier nicht in die Zeile sondern in die Spalte.

    d.h. du willst das

    Wert1Datei1;Wert2Datei2;Wert6Datei1;Wert4Datei2

    dein Code produziert das:

    Wert1Datei1
    ;
    Wert2Datei2
    ;
    Wert6Datei1
    ;
    Wert4Datei2

    Und wenn das Array staendig neu gebaut werden muss kostet das viel Resourcen und benotigt somit Zeit.

    Hier ein BeipsileCode das ein Array baut mit den Zahlen von 0-100000, der Code braucht je nach System mehrere Minuten in meinem Fall ueber 8 Minuten.

    # Langsam Array
    Measure-Command {
    	$Array = @()
    	$i = 0
    	do {
    		$Array += "$i" 
    		$i++
    	} until ($i -gt 100000)
    }
    Und hier Code der das gleiche produziert aber nur ein paar Millisekunden braucht.

    # Schnell ArrayList
    Measure-Command {
    	$ArrayList = New-Object System.Collections.ArrayList
    	$i = 0
    	do {
    		$Null = $ArrayList.Add("$i")
    		$i++
    	} until ($i -gt 100000)
    }

    Unterschied ist, dass ich hier ArrayList nutze das deutlich schneller arbeitet.

    Beste Gruesse
    brima

    Donnerstag, 8. Januar 2015 15:29
  • @Brima

    Arrays die Text enthalten sind hier nicht Ziel führend.

    In PowerShell sollte man möglichst IMMER mit Objekten arbeiten, und hier erstellt Import-CSV Objekte.


    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+

    Donnerstag, 8. Januar 2015 16:00
  • Hallo Peter,

    das ist klar. Ich wuerde das ganze auch PowerShell like loesen, aber darauf bist du ja schon eingegangen.

    Deshalb habe ich das in meinem Beitrag nicht nochmal aufgegriffen, und auch keinen konkreten Loesungsvorschalg gebracht, sondern wollte damit nur zeigen, wo in seinem Code die Speedprobleme her kommen.

    Beste Gruesse
    brima


    • Bearbeitet brima Donnerstag, 8. Januar 2015 16:58
    Donnerstag, 8. Januar 2015 16:47
  • Hallo struppi1979,

    haben die Tipps weitergeholfen?

    Wenn Sie eine Lösung gefunden haben, bitte teilen Sie sie der Community mit, sodass auch andere Benutzer als der Fragesteller davon profitieren können

    Bitte beachten Sie, dass ich wegen keiner weiteren Aktivitäten das Thema als Diskussion verschieben werde. 

    Gruß,

    Teodora


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 12. Januar 2015 08:24
    Moderator