AGB  ·  Datenschutz  ·  Impressum  







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

.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 2 von 7     12 34     Letzte » 
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
 
#11
  Alt 19. Apr 2015, 09:21
Guten Morgen,
danke für eure Hilfe. Das hätte ich ja gar nicht erwartet.

Ihr seid spitze!

Nur komme ich einfach nicht weiter.

Ich erstellte einen "tbutton" und darin setzte ich den code. Bekomme lauter Fehler.

Das Programm speicherte ich ab und lud es hier hoch: https://www.dropbox.com/sh/32uhaxoo8...rGJa?dl=0&s=sl (auch zusammen in test.rar)


Eben kam ein Hinweis, das etwas bei copy & paste falsch gelaufen sein sollte, aber die Programmzeile finde ich bereits im code.

Die Zeile "{----------------------------------}" dient nur als Trennung von dem Delphi - vorgegebenen und dem Code von euch.

Delphi-Quellcode:
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
{-------------------------------}

uses
  FileCtrl;

procedure GetFiles(Path, ExtMask: String; List: TStrings);
const
  Attrib = faArchive or faReadOnly or faHidden or faSysFile;
var
  SR: TSearchRec;
begin
  Path := IncludeTrailingBackslash(Path);

  while Copy(ExtMask, 1, 1) = '.do Delete(ExtMask, 1, 1);

  if FindFirst(Path + '*.' + ExtMask, Attrib, SR) = 0 then
  repeat
    if SameText('.' + ExtMask, ExtractFileExt(SR.Name)) then
      List.Add(Path + SR.Name);
  until FindNext(SR) <> 0;
  SysUtils.FindClose(SR);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  VorneZeilenIgnorieren,
  HintenZeilenIgnorieren,
  i, k: Integer;
  Dir, OutPath: String;
  slDateiListe, slGrosseCsv, slEinzelCsv, slTemp: TStringList;
begin
  VorneZeilenIgnorieren := 0; //2;
  HintenZeilenIgnorieren := 0; //5;

  if not SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt], 0) then
  begin
    MessageDlg('Kein Ordner ausgewählt.', mtError, [mbOk], 0);
    Exit;
  end;

  slDateiListe := TStringList.Create;
  try
    GetFiles(Dir, 'csv', slDateiListe);

    if slDateiListe.Count = 0 then
    begin
      MessageDlg('Kein Dateien gefunden.', mtError, [mbOk], 0);
      Exit;
    end
    else
      if MessageDlg(Format('%d CSV-Dateien gefunden. Weitermachen?', [slDateiListe.Count]),
        mtConfirmation, [mbYes, mbNo], 0) = mrNo then
          Exit;

    with SaveDialog1 do
    begin
      //Filter := 'CSV-Dateien|*.csv';
      if not Execute then
      begin
        MessageDlg('Vorgang Abgebrochen.', mtError, [mbOk], 0);
        Exit;
      end;
      OutPath := ChangeFileExt(FileName, '.csv');
      if FileExists(OutPath) then
        if MessageDlg('Datei bereits vorhanden. Überschreiben?.',
          mtConfirmation, [mbYes, mbNo], 0) = mrNo then
            Exit;;
    end;

    slGrosseCsv := TStringList.Create;
    try
      for i := 0 to slDateiListe.Count - 1 do
      begin
        slEinzelCsv := TStringList.Create;
        try
          slEinzelCsv.LoadFromFile(slDateiListe[i]);

          //In den csv-Dateien stimmt was nicht, zumindest kommt StringList
          //damit nicht klar. Schnelle Lösung. Es gibt fehlermeldungen, die
          //werden aber ignoriert.
          slTemp := TStringList.Create;
          try
            for k := 0 to slEinzelCsv.Capacity - 1 do
            try
              if Length(slEinzelCsv[k]) > 0 then
              slTemp.Add(slEinzelCsv[k]);
            except
              //Fehler Ignorieren
            end;
            slEinzelCsv.Text := slTemp.Text;
          finally
            slTemp.Free;
          end;

          //Entfernt vorne Zeilen, wenn gewünscht
          k := VorneZeilenIgnorieren;
          while (slEinzelCsv.Count > 0) and (k > 0) do
          begin
            slEinzelCsv.Delete(0);
            Dec(k);
          end;

          //Entfernt vorne Zeilen, wenn gewünscht
          k := HintenZeilenIgnorieren;
          while (slEinzelCsv.Count > 0) and (k > 0) do
          begin
            slEinzelCsv.Delete(slEinzelCsv.Count - 1);
            Dec(k);
          end;

          slGrosseCsv.AddStrings(slEinzelCsv);
        finally
          slEinzelCsv.Free;
        end;
      end;

      slGrosseCsv.SaveToFile(OutPath);
      MessageDlg('CSV-Dateien zusammengefügt und erfolgreich gespeichert ' +
        'unter: "' + OutPath + '".', mtInformation, [mbOk], 0);
    finally
      slGrosseCsv.Free;
    end;
  finally
    slDateiListe.Free;
  end;
end;


{-------------------------------}
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 11 Alexandria
 
#12
  Alt 19. Apr 2015, 10:50
"Falsch gelaufen" ist gut.

Du kopierst fast den Inhalt einer kompletten Unit (mehrere Prozeduren inkl. Uses-Abschnitt) in eine Prozedur rein, wo natürlich nur der Inhalt einer einzelnen Prozedur rein gehört ... das kann einfach nicht gehn.
Und genau das hat dir auch der Compiler gesagt, also daß er an dieser Stelle kein "unit" haben will.

Geändert von himitsu (19. Apr 2015 um 10:53 Uhr)
  Mit Zitat antworten Zitat
Popov
 
#13
  Alt 19. Apr 2015, 14:30
@Dade

Das hat irgendwie keinen Zweck. Anscheinend kopierst du alles ohne überhaupt zu gucken was du wo kopierst. Also eigentlich dachte ich, dass Copy&Paste die einfachste Art der Programmierung sind, aber selbst das muss man mit etwas Überlegung machen. Wie kann man einen ganzen Text mit zwei Prozeduren nehmen und ohne Überlegung einfach irgendwo rein kopieren?

Mich hat der Fehler von gestern etwas beschäftigt. Warum es gestern den Fehler gab, ich weiß es nicht, heute war er nicht da. Also habe ich noch paar Buttons dazu gefügt, alles auf drei Prozeduren aufgeteilt und ein fertiges Programm erstellt. Das kannst du haben, denn sonst wärst du schneller wenn du alles von Hand zusammenfügst.
Angehängte Dateien
Dateityp: zip CSV-Zusammenfuegen.zip (6,0 KB, 31x aufgerufen)
  Mit Zitat antworten Zitat
Dade
 
#14
  Alt 19. Apr 2015, 14:49
Wow, vielen, vielen Dank.

Die app funkioniert super.

Nun kann ich mich daran machen Delphi zu lernen und dein Tool zu verstehen.

Dazu gleich eine Frage:

Lässt du jedes Feld der .csv - Datei (also jeweils zwischen ;...... einzeln einlesen und einzeln abspeichern? Dann könnte ich nämlich da irgendwann mal ansetzen und versuchen die Daten zu verändern.

Denn letztendlich sollen die Daten nur eingelesen, bearbeitet und in ganz anderer Form gespeichert werden.
  Mit Zitat antworten Zitat
DadeLL
 
#15
  Alt 19. Apr 2015, 16:20
Lese ich das richtig?

Die Daten sollen "letztendlich nur" eingelesen, bearbeitet und in ganz anderer Form gespeichert werden?

Wieviel kostet denn solch ein Doktorvater "letztendlich nur"?

  Mit Zitat antworten Zitat
Dade
 
#16
  Alt 19. Apr 2015, 16:28


wenn es so einfach wäre. (Das "nur" war relativ optimistisch )

Es geht darum: Ein Programm zum Auszählen und Messen von Zellen und deren Bestandteilen (alles Handarbeit) gibt mir die Ursprungs - .csv - Dateien aus.

Auf diese habe ich gar keinen Einfluss.

Diese addieren sich bestimmt zu ca. 1500 Stück. Damit kann man aber nichts anfangen. Ziel ist es diese vielen Daten, wie Größe, Anzahl (kodiert z.b. als L_K_1_K, L_K_2_R, L_K_3_K, etc.) richtig analysiert in einer einzigen csv Datei zu sammeln. Dies kann dann anschließend statistisch analysiert werden.

Das Programm soll einfach nur die stupide manuelle und fehleranfällige Arbeit über Wochen abnehmen.

In diesem Fall wäre z.B. wichtig in den Angaben: L_K_1_K z.B. zu zählen, wie oft die L_K (Lymphknoten) - Angabe mit zusätzlichem _K (Kern) auftaucht pro csv Datei.


Klingt relativ einfach, aber 1500x eine csv Datei öffnen, zählen, Messerte übertragen....puh, das schreit förmlich nach Tippfehlern.

Das ist also noch lange nicht die Arbeit, nur ein kleiner Schritt auf dem Weg zum Ziel.

Geändert von Dade (19. Apr 2015 um 16:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG
 
#17
  Alt 19. Apr 2015, 17:04
Klingt relativ einfach, aber 1500x eine csv Datei öffnen, zählen, Messerte übertragen....puh, das schreit förmlich nach Tippfehlern.
Wer macht denn so etwas?

Bei uns werden für solche Programmieraufgaben öfter mal Studenten als HiWis angestellt. Ein Informatik-Student mit ein bisschen Pythonkenntnissen (oder auch ohne) sollte solche eigentlich schnell hinbekommen. Delphi ist imho nicht unbedingt die übliche/passende Sprache für solche Aufgaben.
Auch die statistische Auswertung kann man mit Paketen wie Matplotlib gut hinbekommen.

Wenn man viel Statistik und weniger Zeilenbasierte Textverarbeitung macht, kann man sich auch R mal angucken.



Aber wenn du es mit Delphi machen willst, dann gibt es hier genug sachkundige Hilfe. Das ist ja auch was wert
  Mit Zitat antworten Zitat
Dade
 
#18
  Alt 19. Apr 2015, 17:13
Tja, bei uns gibt es nicht extra Hiwis für diese Arbeit....hier gibt es nur "Doktoranden"

Ich habe bereits einen Statistiker, der R beherrscht. Leider will der die Daten halt in einer einzelnen csv Datei.


Delphi....ich dachte nach Pascal in der Jugend müsste das doch klappen, aber ist alles doch irgendwie anders.
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

 
Delphi 10.3 Rio
 
#19
  Alt 19. Apr 2015, 21:32
Hallo,

codemäßig kann ich dich hier (noch) nicht unterstützen, da meine persönliche Einschätzung die ist, dass das Ganze momentan zu aufwendig werden würde.
Ich hatte aber mal ein Tool programmiert, welches Csv Dateien einlesen kann und sehr gute Filtermöglichkeiten bietet. Die Anzahl der Ergebnisse wird in der 1. Spalte unten angezeigt.
Für die Anzeige und Filterung nutze ich das geniale cxGrid von DevExpress und die Csv-Datei wird in einem Dataset vorgehalten.
Die Frage wäre auch, ob du die CSV Dateien mit dem Programm von Popov in eine Datei zusammenführst (das Programm ist hier auch im Anhang), dann mit meinem Tool filterst und abschließend in Excel bearbeitest.
Wenn du ein fertiges Programm selbst erstellen möchtest, müssten deine Vorgaben präzisiert werden. Ich kann mir vorstellen, dass das Ganze aber sehr aufwendig werden kann.

//Edit
- Bedingung für das Csv-Filtertool von mir ist, dass deine zusammengefügte Csv-Datei in allen Zeilen den gleichen "Satzaufbau" hat (gleiche Anzahl "Spalten" und die Werte immer an derselben Stelle stehen)
- Mein Filtertool bietet einen Excelexport der gefilterten Ergebnisse an...(dazu muss Excel nicht auf dem Rechner installiert sein)
Angehängte Dateien
Dateityp: zip CSV-Filterung.zip (3,15 MB, 39x aufgerufen)
Jürgen

Geändert von juergen (19. Apr 2015 um 21:43 Uhr)
  Mit Zitat antworten Zitat
Dade
 
#20
  Alt 1. Mai 2015, 10:36
HI Leute,
ich habe mich mal genau darangesetzt und versucht die exakten Anforderungen darzustellen:



Die Aufgabe:
- Es soll in einem Verzeichnis alle .csv - Dateien finden und nach einander einlesen und bearbeiten.

Dank eurer Hilfe habe ich bereits den Programmcode zum Importieren der csv - Dateien. Leider stehe ich bei Delphi völlig am Anfang.

Quelldatei - Beispiel:
Name..................Perimeter (µm)........Area (µm2)

LK_1_1_F_1...........835,4.......................4 8705,5
...
LK_1_1_K_2............980......................... 53469,4
...
LK_1_1................20210,2...................26 170792,4
...
Metastase_LK_1_2......25142,1..................802 9364,2


Quelldateien und Ziel - EXCEL Tabelle befinden sich hier:
https://www.dropbox.com/sh/blbndn594...t68a?dl=0&s=sl


- Die Bearbeiteten Daten jeder .csv - Datei kommt in eine neue Zeile (Daten können aber mehrere Zeilen beanspruchen)

- Der Dateiname soll in der 1. Spalte stehen

( X kann Werte von: 1-20 annehmen)

- [LK_X_X] + Spalte mit Werten (LK_1_1, LK_1_2, ... stehen in einer Spalte )

- [LK_X_X] + passende [Metastase_LK_X_X] = Extraspalte: 1
- [LK_X_X] + keine passende [Metastase_LK_X_X] = Extraspalte: 0

(Metastase_LK_1_1 , Metastase_LK_1_2, Metastase_LK_1_3)

- Dahinter Summe aller [LK_X_X_F] + Extraspalte mit den Einzelnamen (LK_1_1_F usw. Z.B. 16, wenn es LK_1_1_K_1 .... LK_1_1_K_16 in der Quelldatei steht.)

- Summe aus [LK_X_X_K] + Extraspalte mit den Einzelnamen (LK_1_1_K)

- Summe aus [LK_X_X_K_X_R] + Extraspalte mit den Einzelnamen (LK_1_1_K_1_R)

- Summe aus [LK_X_X_NK] + Extraspalte mit den Einzelnamen + Extraspalten mit entsprechenden Werten (LK_1_1_NK)



Quelldateien und Ziel - EXCEL Tabelle befinden sich hier:
https://www.dropbox.com/sh/blbndn594...t68a?dl=0&s=sl


Ich weiß das ist nicht gerade einfach, aber wer hat dafür eine Lösung?

Vielen Dank

Geändert von Dade ( 1. Mai 2015 um 10:44 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2023, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf