Einzelnen Beitrag anzeigen

Benutzerbild von frankyboy1974
frankyboy1974

Registriert seit: 7. Apr 2015
Ort: SH
169 Beiträge
 
Delphi XE7 Professional
 
#47

AW: .csv Datei einlesen, analysieren und bearbeitet abspeichern.

  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
Java ist auch eine Insel.
Ist Delphi von Oracle?
In meiner Buchstabensuppen fehlt das C++!
  Mit Zitat antworten Zitat