AW: .csv Datei einlesen, analysieren und bearbeitet abspeichern.
Zitat:
Also, das "Aufbereiten" der Quelldateien ist nur ein winzig kleiner Teil der Arbeit. Diese Daten werden nämlich mit anderen Daten verglichen, die noch gesammelt werden müssen, jedoch mit einem anderen Programm, dass die Daten ebenfalls als .csv - Datei abspeichert. Jedoch wiederum anders. Daher muss eine der Ausgabe - CSV - Dateien dementsprechend angepasst werden. Erst danach fängt überhaupt die richtige Arbeit an. Als Ziel soll das Tool eine csv - Datei erstellen. In EXCEL Kann dies natürlich dann importiert werden. (Ist vielleicht etwas blöd beschrieben worden) Grundsätzlich beschreibst du genau den Ablauf. - Ein Programm gibt, nach Markierung tausender Stellen in tausenden Bildern, eine CSV - Datei aus. - Diese Datei kann in EXCEL importiert werden. Leider völlig falsch soritert. - Ein Tool soll nun den Dateinamen jeder Datei mit in die csv - Datei einfügen und die Daten etwas umstrukturieren. [wieso ihr nicht denken müsst, damit ist die Doktorarbeit erledigt] - Alle Bilder müssen per Hand unter dem Mikroskopt gemacht werden - Vorher natürlich die Proben von Patienten gesammelt, eingelegt, vorbereitet und geschnitten werden - Dann erfolgt natürlich noch die Färbung - Sichtung und Entscheidung welche Schnitte warum und wieso passend sind ( Das dauerte bis jetzt schon fast 2,5 Jahre ) - Diese Schnitte werden dann zusätzlich mit anderen Spezialprogrammen unter anderem Licht nach anderen Zellen untersucht (sehr aufwändig) - Anschließend diese Daten mit den bestehenden kombiniert in einer noch größeren Tabelle - Wenn das alles fertig ist, dann kommt die statistische Auswertung vom Statistiker Ihr seht, das Sortieren dieser 1500 CSV - Dateien ist wirklich nur etwas, das per Handarbeit Monate (neben normalem Full-Time-JOB als PJ (Arzt in Ausbildung sozusagen) in der Klinik (min. 10h täglich für 300€ / Monat für ein Jahr) in Anspruch nehmen würde. Von den Fehlern ganz abgesehen. Daher hoffe ich bitte, bitte auf eure Hilfe. |
AW: .csv Datei einlesen, analysieren und bearbeitet abspeichern.
Zitat:
Was ich in CSV sehe (> Björk) und was Du zum Zielformat Excel (?) beschreibst, hat m.E. wenig mit Import, umstrukturieren zu tun bzw. geht "etwas" darüber hinaus. Für Dich ist das meinetwegen eine Umstrukturierung, für mich ist das bereits Analyse / Reporting und wie gesagt, nicht ohne weiteres prozedural zu implementieren respektive einfach der falsche Weg. Zum Eingangsformat: Vielleicht habe ich in all dem Durcheinander was übersehen, aber die CSV Daten beinhalten 2 Sektionen, wo ist insbesondere die Bedeutung der 2. Sektion beschrieben? |
AW: .csv Datei einlesen, analysieren und bearbeitet abspeichern.
Zitat:
Hilf mir kurz, was meinst du mit 2. Sektion? Meinst du die 2. /3. Spalte? |
AW: .csv Datei einlesen, analysieren und bearbeitet abspeichern.
Es geht um das hier:
Zitat:
|
AW: .csv Datei einlesen, analysieren und bearbeitet abspeichern.
Zitat:
Der 2. Block mit: Distance measurement annotations;; Length (µm);; 5,15;; 3,22;; Ist wichtig und sollte übernommen werden in zwei extra Spalten. Leider sind sie nicht in jeder Datei vorhanden. Zur Not kann das auch unter den Tisch fallen. Muss halt per Hand gemacht werden. |
AW: .csv Datei einlesen, analysieren und bearbeitet abspeichern.
Deine Infos sind leider nicht ausreichend. Ich hab mir's nochmal angeschaut. Bin ja nach wie vor der Meinung, daß man das nicht Delphi machen sollte? Aber wenn du unbedingt willst. Man könnte das zum Beispiel mit meinem TGrid relativ bequem machen. Du müsstest nur das (Siehe unten) weiter ausfüllen (ggf. auch nur Pseudocode) so daß es ein Delphianer auch versteht, sonst kommen wir hier nicht weiter. :wiejetzt:
Delphi-Quellcode:
procedure AufbereitungDerLymphknotenDaten(const FileName: string; Grid: TGrid):
var I, J, K, Row, FollikelCount: integer; Csv: TCsvFile; Indices: array of integer; begin Csv := TCsvFile.Create; try Csv.LoadFromFile(FileName); Grid.Clear; // Row = Zeile, Col = Spalte Grid.ColCount := 18; for I := 1 to 20 do for J := 1 to 20 do if HaveLymphknotennummer(Csv, I, J) then begin Row := Grid.AddRow; // Zeile hinzufügen Grid.Cells[Row, 0] := GetFallnummer(FileName); Grid.Cells[Row, 1] := GetLymphknotennummer(I, J); FollikelCount := GetFollikelCount(Csv, I, J, Indices); Grid.Cells[Row, 3] := IntToStr(FollikelCount); for K := 0 to FollikelCount - 1 do begin Row := Grid.AddRow; Grid.Cells[Row, 4] := IntToStr(Indices[K]); Grid.Cells[Row, 5] := GetPerimeter(I, J, Indices[K], Csv); Grid.Cells[Row, 6] := GetArea(I, J, Indices[K], Csv); end; (* 5. Spalte: Keimzentren vorhanden ja=1, nein=0: Wenn irgend ein LK_X_K, LK_X_X_K, LK_X_X_X_K -> ja, sonst nein 6. Spalte: Anzahl der Keimzentren: Auftrittsanzahl der Lymphknoten mit Keimzenren (alle Lk_X_K / LK_X_X_K / LK_X_X_X_K) 7. Spalte: Anzahl der regressiven, hyalinisierten Keimzentren (RHK): Auftrittsanzahl der Lymphknoten mit RHK (alle Lk_X_K_R / LK_X_X_K_R / LK_X_X_X_K_R) 8. Spalte: Metastase: Alle VarLymph mit "Metastase" im Namen: Metastase_LK_X, Metastase_LK_X_X 9. Spalte: Umfang Metastase: Umfang der Metastase VarUmfang 10. Spalte: Fläche Metastase: Fläche der Metastase VarFläche 11. Spalte: Follikelnummer: Alle VarLymph mit F im Namen, wie LK_X_F, LK_X_X_F, LK_X_X_X_F 12. Spalte: Umfang Follikel: Umfang Follikel VarUmfang 13. Spalte: Fläche Follikel: Fläche Follikel VarFläche 14. Spalte: Keimzentrumsnummer: Alle VarLymph mit F im Namen, wie LK_X_K, LK_X_X_K, LK_X_X_X_K, LK_X_K_R, LK_X_X_K_R, LK_X_X_X_K_R 15. Spalte: Umfang Keimzentrum: Umfang Keimzentrum VarUmfang 16. Spalte: Fläche Keimzentrum: Fläche KeimzentrumVarFläche 17. Spalte: Distance measurement: Length 18. Spalte: Distance measurement: UnknownValue *) end; finally Csv.Free; end; end; |
AW: .csv Datei einlesen, analysieren und bearbeitet abspeichern.
Hallo,
ich habe hier mal eine etwas ernsthaftere Lösung für dich, wobei ich das Problem ungefähr bis zur 4. Spalte gelöst habe. Den Rest darfst du dann selbst ergänzen. Ich hoffe ich habe alles richtig verstanden.
Delphi-Quellcode:
Hat mich knapp eine Stunde gekostet.
unit Unit16;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm16 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form16: TForm16; implementation {$R *.dfm} procedure TForm16.Button1Click(Sender: TObject); var SR: TSearchRec; eingangsverzeichnis, ausgangsverzeichnis: String; ein, aus: TStringlist; h, Dateiname: String; I: Integer; zaehler: Array [1 .. 50] of Integer; // Ich habe 50 Zaehlvariablen angelegt , sollte ausreichend sein keimzentren: Array [1 .. 3] of String; // ich bin von 3 LK ausgegangen seperator: String; Dateizaehler:Integer; begin seperator := ';'; Dateizaehler:=0; eingangsverzeichnis := 'C:\Users\Frank\Eingang\'; // Verzeichnis in dem sich die Ursprungs-CSV Dateien befinden ausgangsverzeichnis := 'C:\Users\Frank\Ausgang\'; // Verzeichnis in dem sich am Ende die aufbereiteten Dateien befinden, wird ggf. angeleget ein := TStringlist.Create; // Aktuelle EingabeDatei aus := TStringlist.Create; // Ausgabe Datei try if FindFirst(eingangsverzeichnis + '*.csv', faAnyFile, SR) = 0 then // Durchsucht das Eingangsverzeichnis nach alle CSV -Dateien und iteriert über die Menge begin repeat if (SR.Attr <> faDirectory) then // Es werden keine Untergeordneten Verzeichnisse mit genommen begin Dateiname := SR.Name; // Weist den aktuelle Dateiname zu ein.LoadFromFile(eingangsverzeichnis + Dateiname); // Lädt den Inhalt der aktuellen Datei in eine Stringlist for I := 1 to 50 do // Alle Zaehlvariablen zaehler[I] := 0; // werden bei einer neuen Datei mit null vorbelegt aus.Clear; // Ausgabedatei wird geleert for I := 0 to ein.Count - 1 do begin // Iteriert ueber die Strings in der Stringlist h := ein.Strings[I]; // aktuelle String wird h zugewiesen if pos('LK_1_1_F', h) > 0 then inc(zaehler[1]); // Sofern in dem aktuelle String der Teilstring 'LK_1_1_F' gefunden (>0) // so wird der entsprechende Zaehler um eins erhöht if pos('LK_1_2_F', h) > 0 then inc(zaehler[2]); // Sofern in dem aktuelle String der Teilstring 'LK_1_2_F' gefunden (>0) // so wird der entsprechende Zaehler um eins erhöht if pos('LK_1_2_F', h) > 0 then inc(zaehler[3]); // Sofern in dem aktuelle String der Teilstring 'LK_1_3_F' gefunden (>0) // so wird der entsprechende Zaehler um eins erhöht if pos('LK_1_1_K', h) > 0 then inc(zaehler[4]); // Sofern in dem aktuelle String der Teilstring 'LK_1_1_K' gefunden (>0) // so wird der entsprechende Zaehler um eins erhöht if pos('LK_1_2_K', h) > 0 then inc(zaehler[5]); // Sofern in dem aktuelle String der Teilstring 'LK_1_2_K' gefunden (>0) // so wird der entsprechende Zaehler um eins erhöht if pos('LK_1_3_K', h) > 0 then inc(zaehler[6]); // Sofern in dem aktuelle String der Teilstring 'LK_1_3_K' gefunden (>0) // so wird der entsprechende Zaehler um eins erhöht // Es werden bis hierhin die Anzahl der Keimzentren berechnet // Die fehlenden Spalten müssten ergänzt werden end;// Ende For Schleife // Die Datei ist jetzt durchlaufen und das Ergebnis wird in eine neue Datei geschrieben aus.Add('Fallnummer' + seperator + 'Lymphknoten' + seperator + 'hier bitte die Überschriften ergänzen jeweils durch seperator getrennt'); if zaehler[4] > 0 then // Sofern Zaehler[4] > Null Keimzentrenvorhanden auf 1 setzen keimzentren[1] := '1' else keimzentren[1] := '0'; // Ansonsten auf Null if zaehler[5] > 0 then keimzentren[2] := '1' else keimzentren[2] := '0'; if zaehler[6] > 0 then keimzentren[3] := '1' else keimzentren[3] := '0'; aus.Add(stringreplace(Dateiname, '.csv', '', [rfignorecase]) + seperator + 'LK_1_1' + seperator + inttostr(zaehler[1]) + seperator + keimzentren[1] + seperator + inttostr(zaehler[4])); // Diese Zeilen sind nach hinten noch zu ergänzen aus.Add(stringreplace(Dateiname, '.csv', '', [rfignorecase]) + seperator + 'LK_1_2' + seperator + inttostr(zaehler[2]) + seperator + keimzentren[2] + seperator + inttostr(zaehler[5])); // Diese Zeilen sind nach hinten noch zu ergänzen aus.Add(stringreplace(Dateiname, '.csv', '', [rfignorecase]) + seperator + 'LK_1_3' + seperator + inttostr(zaehler[3]) + seperator + keimzentren[3] + seperator + inttostr(zaehler[6])); // Diese Zeilen sind nach hinten noch zu ergänzen ForceDirectories(ausgangsverzeichnis); // Erzeugt ggf Ausgabeverzeichnis falls noch nicht vorhanden aus.SaveToFile(ausgangsverzeichnis + Dateiname); // AusgabeDatei wird im Ausgabeverzeichniss mit dem Originalnamen gespeichert inc(Dateizaehler); end; until FindNext(SR) <> 0; // Finden die nächste CSV und springt nach oben , solange noch welche vorhanden FindClose(SR); // Schliesst den Suchvorgang end; showmessage('Fertig! Es wurden '+inttostr(Dateizaehler)+' Dateien konvertiert.'); finally ein.Free; // Stringlist wieder freigeben , ansonsten Speicherleak :-)))) aus.Free; // Welch Katastrophe 100 Bytes reserviert und nicht wieder zu verwenden end; end; end. mfg Frank |
AW: .csv Datei einlesen, analysieren und bearbeitet abspeichern.
Zitat:
|
AW: .csv Datei einlesen, analysieren und bearbeitet abspeichern.
Die neuen Dateien haben komplett andere Strukturen als die Rohdaten. Welche muß zuerst anhand der Infos aus "roh csv" ermittelt werden. :-D
|
AW: .csv Datei einlesen, analysieren und bearbeitet abspeichern.
Ja, das ist irgendwie schon "klar". Excel soll es ja nicht unbedingt sein, schreibt dade irgendwo. Die Quell - bzw. Transformationsbeschreibung ist nicht sehr "eingängig" bzw. unvollständig. Wie gesagt, die Daten in Dropbox nützen mir nichts. Vielleicht sind die Summierungen in Excel ja nur nice to have oder so, die Sektion 2 ist im CSV File ist ja auch irgendwie egal.
In Delphi macht es m.E. nicht soviel Sinn, die Aufbereitung umzusetzen, das ist umständlich und unflexibel. Ich habe einfach mal einen kleinen Zwischenschritt bereitgestellt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz