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 7 von 7   « Erste     567   
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)
 
Dejan Vu
 
#61
  Alt 4. Mai 2015, 20:18
Vielleicht schießt Du da etwas übers Ziel hinaus.
Es ist nicht seine Doktorarbeit....
Deswegen: *WENN*, also: IF---THEN

Ich hatte das im Vorüberfliegen so interpretiert. Aber eben nur im Vorüberfliegen.
Dejan Vu, das ist nun wirklich Quark. Ein Mediziner weiß normalerweise nicht mal was eine csv Datei ist? ...
Nein Nein. Falsch verstanden: Hier nochmal

Delphi-Quellcode:
If TheThreadErsteller.WantsTo.Make.His.(Doktorarbeit) Then
  TheThreadErsteller.HasHimSelfNotReallyGoodVorbereitet := True
Else
  Writeln('Welcome in the realität [Forschungseinrichtung ohne IT]. We help gerne');
Der 'else Zweig' ist nachträglich reingebaut, ansonsten ist es eine einfache Implikation, die komischerweise immer misverstanden wird. Ich hätts wissen müssen
  Mit Zitat antworten Zitat
Popov
 
#62
  Alt 4. Mai 2015, 20:44
Ich hab eine Art Universal-Parser für Texte wie z. B. Metastase_LK_1_1_1_R_1 geschrieben. Man gibt nur GetCode('LK', 'Metastase_LK_1_1_1_R_1') und den gesuchten Code ein, z. B. LK und die Funktion liefert einen Array of Word mit den passenden Werten zurückt.

Delphi-Quellcode:
type
  TCodeW = array of Word;

  TCode = record
    CodeS: string;
    CodeW: TCodeW;
    Count: Integer;
    CodeSExists: Boolean;
  end;

function GetCode(ACodeS, AText: string): TCode;

  function GetNum(var s: string): Integer;
  var
    sTemp: string;
  begin
    while (Length(s) > 0) and not (s[1] in ['0'..'9']) do
      Delete(s, 1, 1);

    sTemp := '';
    while (Length(s) > 0) and (s[1] in ['0'..'9']) do
    begin
      sTemp := sTemp + s[1];
      Delete(s, 1, 1);
    end;

    if Length(sTemp) > 0 then
      Result := StrToInt(sTemp)
    else
      Result := -1;
  end;

var
  i, p: Integer;
  w: Integer;
  sTemp: String;
begin
  with Result do
  begin
    CodeS := AnsiUpperCase(ACodeS);
    SetLength(CodeW, 0);
    Count := 0;
    CodeSExists := False;

    //Evtl. ist es besser nach CodeS + '_' zu suchen, falls immer ein '_' folgt.
    p := Pos(CodeS, AnsiUpperCase(AText));
    //p := Pos(CodeS + '_', AnsiUpperCase(AText));
    CodeSExists := p > 0;
    if not CodeSExists then
      Exit;

    sTemp := '';
    for i := p + Length(CodeS) to Length(AText) do
      if AText[i] in ['0'..'9', '_'] then
        sTemp := sTemp + AText[i]
      else
        Break;

    repeat
      w := GetNum(sTemp);
      if w > - 1 then
      begin
        Inc(Count);
        SetLength(CodeW, Count);
        CodeW[Count - 1] := w;
      end;
    until w < 0;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Code: TCode;
  i: Integer;
begin
  Code := GetCode('L', 'Metastase_LK_1_1_1_R_1');

  ShowMessage('Gesuchter Code: ' + Code.CodeS);
  if Code.CodeSExists then
    ShowMessage('Text "' + Code.CodeS + '" ist im String vorhanden')
  else
    ShowMessage('Text "' + Code.CodeS + '" ist im String nicht vorhanden');
  ShowMessage('Anzahl: ' + IntToStr(Code.Count));
  for i := 0 to Code.Count - 1 do
    ShowMessage('Wert: ' + IntToStr(i + 1) + ' = ' + IntToStr(Code.CodeW[i]));
end;
Soviel ohne genau zu wissen um was es da geht.

Geändert von Popov ( 4. Mai 2015 um 22:33 Uhr) Grund: Eine kleine Erweiterung eingebaut
  Mit Zitat antworten Zitat
Bjoerk

 
Delphi 10.4 Sydney
 
#63
  Alt 4. Mai 2015, 21:50
Ich hab eine Art Universal-Parser für Texte wie z. B. Metastase_LK_1_1_1_R_1 geschrieben. [..]
Toller "Universalparser"? Macht aus Metastase_LK_1_1_1_R_1 LK 1 1 1. Das R1 kommt gar nicht mehr vor? Besser wäre hier einfach eine Splitsting mit _ als Delimiter.
  Mit Zitat antworten Zitat
Popov
 
#64
  Alt 4. Mai 2015, 22:31
Toller "Universalparser"? Macht aus Metastase_LK_1_1_1_R_1 LK 1 1 1. Das R1 kommt gar nicht mehr vor?
Das hast du richtig erkannt. Das ist Absicht.

Um LK Werte zu ermitteln, rufst du GetCode('LK', 'LK_1_1_1_R_1'); auf. Als Ergebnis bekommst du nur die Werte die zu LK gehören.

Um R Werte zu ermitteln, rufst du GetCode('R', 'LK_1_1_1_R_1'); auf. Als Ergebnis bekommst du die Werte die zu R gehören.

Du bekommst also nicht alles in einem Rutsch gesplittet zurück, sondern immer nur die Werte zu dem gesuchten Parameter gehören. Du musst in einer Routine also alles abrufen. Willst du die Werte zu LK wissen, rufst du die Funktion mit LK auf, bei R zu R, usw.

Aber mir ist noch eine kleine Idee dazugekommen.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG
 
#65
  Alt 4. Mai 2015, 22:53
Und wenn man das Konzept für einen zeilenbasierten "Universal-Parser" weiterverfolgt, kommt vermutlich irgendwann AWK raus
Wobei wir wieder bei "Delphi ist vermutlich nicht das Tool für den Job" sind ... SCNR
  Mit Zitat antworten Zitat
Benutzerbild von blondervolker
blondervolker

 
Delphi XE2 Architect
 
#66
  Alt 5. Mai 2015, 00:05
Guten Abend,

vielleicht wäre das ja was:
https://www.tmssoftware.com/site/asg65.asp
www.bewerbungsmaker.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 7   « Erste     567   


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 22:27 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