Benutzer mit den meisten Antworten
Warum läuft mein Programm ewig?

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
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+- Bearbeitet Peter Kriegel Donnerstag, 8. Januar 2015 09:53
- Als Antwort markiert Denniver ReiningMVP, Moderator Montag, 19. Januar 2015 11:59
-
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
;
Wert4Datei2Und 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
- Als Antwort markiert Denniver ReiningMVP, Moderator Montag, 19. Januar 2015 11:59
Alle Antworten
-
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+- Bearbeitet Peter Kriegel Donnerstag, 8. Januar 2015 08:57
-
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+- Bearbeitet Peter Kriegel Donnerstag, 8. Januar 2015 09:53
- Als Antwort markiert Denniver ReiningMVP, Moderator Montag, 19. Januar 2015 11:59
-
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;;;;;;;;;;;
-
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+ -
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
;
Wert4Datei2Und 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
- Als Antwort markiert Denniver ReiningMVP, Moderator Montag, 19. Januar 2015 11:59
-
@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+ -
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
-
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.