|
Antwort |
Registriert seit: 18. Apr 2015
HI Leute,
ich bin seit Tagen verzweifelt auf der Suche nach einer Möglichkeit, wie ich viele .csv - Dateien einlesen, einzelne Felder analysieren und alles dann als eine weitere Zeile in nur einer Excel Datei speichern kann. Ich versuchte bereits Delphi zu lernen, da ich früher als Teenager mit Pascal programmierte, aber es hat sich doch sehr viel getan. Ich hoffe sehr, dass ihr mir helfen könnt. Das wäre absolut toll. Ich erkläre kurz worum es geht: Ich bin an einem Projekt und nutze ein Programm, mit dem man Bilder ausmessen und Zellen zählen kann. Diese Ergebnisse werden mir als .csv - Datei ausgegeben. Insgesamt komme ich bestimmt am Ende auf über 1500 Dateien. Diese sehen so aus: -------------------- Annotations;; Name;Perimeter (µm);Area (µm2) LK_1_1_F_1;835,4;48705,5 LK_1_1_F_2;1142,7;93813,4 [.....ca. 20 Zeilen........] LK_1_3;14272,3;7956108,4 ;; Distance measurement annotations;; Length (µm);; 5,15;; 3,22;; --------------------------------- Im Endeffekt müssen nun die Zahlen in bestimmter Art und Weise in der Excel Tabelle später stehen. Zusätzlich muss in der 1. Spalte jeweils der csv-Dateiname erscheinen (ist nämlich die Nummer) + die Angabe: LK_1_1_f_2 (als Beispiel von oben) analysiert werden nach "wie oft taucht "F" auf. Für jede .csv - Datei müssen die addiert und dann auch in einer Spalte stehen. Ich habe hier vorher - Nachher + Erläuterungen hochgeladen: https://www.dropbox.com/sh/blbndn594...t68a?dl=0&s=sl Alleine schaffe ich das nicht. Gruß Kai Geändert von Dade ( 1. Mai 2015 um 13:45 Uhr) |
|
#41
Das müsste es sein. Ich hoffe sehr, dass es verständlich ist. Was meint ihr?
Was ich an der gesamten Anforderung nicht verstehe, ist die Maßgabe, csv Dateien in Exceldateien zu "konvertieren", damit sie mittels irgendeines Statistikprogramms untersucht / aufbereitet werden können. Was aber das "Ergebnis" des "Imports" hier scheinbar darstellt, ist bereits eine (erhebliche) Aufbereitung bzw. Auswertung der CSV Rohdaten! Ist es so oder sehe ich das falsch? Wenn es so ist, würde das bedeuten, dass die wissenschaftliche Arbeit auf Daten aufsetzt, die mittels der Handarbeit irgendeines Hiwis oder Forenmitglieds vorverarbeitet wurden, um es mal wertneutral auszudrücken. Es würde außerdem bedeuten, dass hier nicht von einem Import/Export die Rede ist, sondern von Datenverarbeitung bzw. Reporting, das vom Ansatz her nicht unbedingt geeignet ist, per prozeduraler Sprache umgesetzt zu werden. Was dann auch teilweise die "Komplexität" des Problems und Verwirrung allerseits erklären würde. Vielleicht kannst Du das gedachte Vorgehen noch einmal verdeutlichen, nicht Quell und Zielformat. Ich stelle mir das so vor (hab noch keine Doktorarbeit geschrieben): Irgendeine arme Wurst produziert mittels Point and Click Messdaten aus tausenden von Bildern. Das Programm spukt die Messdaten (Rohdaten) in einem etwas unpraktischen Format aus. Alle Messdatendateien müssen nun eingelesen werden und den Dateinamen als Datenmerkmal erhalten. Die Gesamtdaten müssen nun statistisch, wissenschaftlich aufbereitet und untersucht werden. Dazu wird ein Statistikprogramm verwendet, das scheinbar nur Exceldaten lesen kann. Die Aufbereitung der Daten (Plausibilisierung, Bereinigung, Analyse, Statistik) erfolgt in dem Statistikprogramm durch den Doktoranden oder einen wissenschaftlichen Mitarbeiter. Die Aufgabe hier würde also lauten: 1500 CSV Dateien um den Dateinamen anreichern als Merkmal anreichern und zu einer Excelliste zusammenfassen. Fertig. Was meinst Du? 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. |
Zitat |
Delphi 2010 Enterprise |
#42
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 ..Ablauf. - Ein Tool soll nun den Dateinamen jeder Datei mit in die csv - Datei einfügen und die Daten etwas umstrukturieren. 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? |
Zitat |
|
#43
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 ..Ablauf. - Ein Tool soll nun den Dateinamen jeder Datei mit in die csv - Datei einfügen und die Daten etwas umstrukturieren. 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? Hilf mir kurz, was meinst du mit 2. Sektion? Meinst du die 2. /3. Spalte? |
Zitat |
Delphi 2010 Enterprise |
#44
Es geht um das hier:
Code:
Annotations;;
Name;Perimeter (µm);Area (µm2) LK_1_1_F_1;835,4;48705,5 LK_1_1_F_2;1142,7;93813,4 ...snipp... LK_1_2;39765,9;15226633,7 LK_1_3;14272,3;7956108,4 Distance measurement annotations;; Length (µm);; 5,15;; 3,22;; |
Zitat |
|
#45
Es geht um das hier:
Code:
Annotations;;
Name;Perimeter (µm);Area (µm2) LK_1_1_F_1;835,4;48705,5 LK_1_1_F_2;1142,7;93813,4 ...snipp... LK_1_2;39765,9;15226633,7 LK_1_3;14272,3;7956108,4 Distance measurement annotations;; Length (µm);; 5,15;; 3,22;; 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. |
Zitat |
Delphi 10.4 Sydney |
#46
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.
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; |
Zitat |
Delphi XE7 Professional |
#47
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 |
Zitat |
Delphi 2010 Enterprise |
#48
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.
|
||||||||||||||||||||||||||||||||||||||||||||||||
Zitat |
Delphi 10.4 Sydney |
#49
Die neuen Dateien haben komplett andere Strukturen als die Rohdaten. Welche muß zuerst anhand der Infos aus "roh csv" ermittelt werden.
|
Zitat |
Delphi 2010 Enterprise |
#50
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. |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |