AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte .csv Datei einlesen, analysieren und bearbeitet abspeichern.
Thema durchsuchen
Ansicht
Themen-Optionen

.csv Datei einlesen, analysieren und bearbeitet abspeichern.

Ein Thema von Dade · begonnen am 18. Apr 2015 · letzter Beitrag vom 5. Mai 2015
Antwort Antwort
Seite 5 von 7   « Erste     345 67      
Dade
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)
 
Dade
 
#41
  Alt 2. Mai 2015, 11:18
Das müsste es sein. Ich hoffe sehr, dass es verständlich ist. Was meint ihr?
Dade, leider hast Du noch nicht verraten, warum das alles auf Dropbox bereitgestellt wird. Es wurde schon angemerkt, dass die Bereitschaft der Forenmitglieder dort rumzustöbern relativ gering sein dürfte. Aber das nur am Rande.

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.
  Mit Zitat antworten Zitat
jobo

 
Delphi 2010 Enterprise
 
#42
  Alt 2. Mai 2015, 11:46
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.
Es geht mir nicht darum, die wissenschaftliche Arbeit und Mühe in Zweifel zu ziehen. Es geht um die Anforderung, die umzusetzen ist.
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?
  Mit Zitat antworten Zitat
Dade
 
#43
  Alt 2. Mai 2015, 11:52
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.
Es geht mir nicht darum, die wissenschaftliche Arbeit und Mühe in Zweifel zu ziehen. Es geht um die Anforderung, die umzusetzen ist.
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?
  Mit Zitat antworten Zitat
jobo

 
Delphi 2010 Enterprise
 
#44
  Alt 2. Mai 2015, 12:14
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;;
  Mit Zitat antworten Zitat
Dade
 
#45
  Alt 2. Mai 2015, 12:29
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.
  Mit Zitat antworten Zitat
Bjoerk

 
Delphi 10.4 Sydney
 
#46
  Alt 2. Mai 2015, 13:43
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;
  Mit Zitat antworten Zitat
Benutzerbild von frankyboy1974
frankyboy1974

 
Delphi XE7 Professional
 
#47
  Alt 2. Mai 2015, 14:11
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:
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.
Hat mich knapp eine Stunde gekostet.

mfg

Frank
  Mit Zitat antworten Zitat
jobo

 
Delphi 2010 Enterprise
 
#48
  Alt 2. Mai 2015, 16:52
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.
Du möchtest also sowas:
SOURCEFILENAMEFOLNAME_RAWPERIMETER_NUMAREA_NUMDMANNOTATION1_NUMDMANNOTATION2_NUM 
1Lu_39893_12_1ALK_1_1_F_1835,448705,53,225,15 
2Lu_39893_12_1ALK_1_1_F_21142,793813,43,225,15 
3Lu_39893_12_1ALK_1_1_F_4811,936774,73,225,15 
4Lu_39893_12_1ALK_1_1_F_51044,460502,53,225,15 
5............ 
  Mit Zitat antworten Zitat
Bjoerk

 
Delphi 10.4 Sydney
 
#49
  Alt 2. Mai 2015, 17:29
Die neuen Dateien haben komplett andere Strukturen als die Rohdaten. Welche muß zuerst anhand der Infos aus "roh csv" ermittelt werden.
  Mit Zitat antworten Zitat
jobo

 
Delphi 2010 Enterprise
 
#50
  Alt 2. Mai 2015, 18:26
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 7   « Erste     345 67      


Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:28 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