Werte aus xls- oder csv-datei auslesen?!

yasukatakaya

Mitglied
Hallo,
ich bin ein Newbie in Sachen Delphi und deswege frage ich hier im Forum nach, ob ihr mir helfen könnt
und zwar habe ich folgendes Problem:

Ich lese ein paar Infos aus einem Prog (Altium Designer) wie z.B. einen Widerstand R1 dazu will ich in
einer Tabelle (xls- oder csv-Datei) nachgucken, welcher Wert dazugehört, und diesen füge ich dann in
das Prog ein!
Also das Problem ist, ich hab eine Variable in der verschiedene Bauteile gespeichert werden und diese
werden dann in einer Tabelle gesucht und das dazugehörige Wert etc. in einer anderen Variable
gespeichert, die ich dann in das Prog einfügen werde, wie kann ich dieses bewerkstelligen?!

Ich hoffe mir kann jemand helfen!

Danke im Voraus und einen schönen Abend noch!

PS: die datei sieht zB so aus
HTML:
Value   Designator	    Firma
20K	       R1	       a
130K	       R2	       b
34K	       R3	       c
45K	       R4	       d
123K	       R5	       e
76K	       R6	       f
 
Ich bin nicht mehr in der Arbeit und kann daher den Code nicht mehr so ohne weiteres testen, aber ich versuche mal, was Passendes zusammen zu schreiben:
Code:
uses
  StrUtils,
  SysUtils;

function GetValue(pFilename: String; pKey: String): String;
var
  lFile: TStringList;                    // Puffer für die CSV-Datei
  i: Integer;                               // Schleifenzähler
  nEnd: Integer;                        // Index für auszuschneidenden Textteil
  lBuffer: String;                        // Lokaler Textpuffer für Stringbearbeitung
  nPos: Integer;                        // Lokaler Substring-Zeiger
begin
  Result := '';                            // Generell ist erstmal nicht gefunden worden
  if (pFilename <> '') and           // Dateiname, Suchbegriff müssen gegeben sein...
    (pKey <> '') and
    FileExists(pFilename) then   // ...und die Datei natürlich auch existieren
  begin
    lFile := TStringList.Create;
    lFile.LoadFromFile(pFilename);
    if lFile.Count > 0 then           // Vergleichssuche startet nur, wenn die Datei auch Inhalt
    begin                                  // hatte
      for i := 0 to lFile.Count - 1do
      begin
        // Pos schaut, ob der Suchbegriff (z.B. R1) in der gelesenen Zeile vorkommt.
        // Falls ja, gibt Pos die Position in der Zeile wieder. Dabei ist Pos aber auf 1
        // basiert und nicht wie die meisten anderen Stringfunktionen auf 0!
        nPos := Pos(pKey, lFile.Strings[i]);

        if nPos > 0 then
        begin
          // Wenn der Suchbegriff gefunden wurde, wird erstmal alles Links des
          // Suchbegriffs aus der gelesenen Zeile entfernt (gepuffert natürlich, die
          // Originaldatei wird nicht verändert.
          lBuffer := RightStr(lFile.Strings[i], nPos);
          lBuffer := Trim(lBuffer);

          // Der Wert zum gesuchten Begriff gilt als beendet, wenn wieder ein
          // Leerzeichen gefunden wird
          nEnd := Pos(' ', lBuffer);

          // Es wurde definitiv der Vergleichswert gefunden. Wenn also kein Leerzeichen
          // mehr folgt, kann es z.B. sein, dass der gesuchte Wert am Ende der Zeile
          // stand und dementsprechend muss der gesamte Rest der Zeile als Wert
          // verwendet werden.
          if nEnd := 0 then nEnd := Length(lBuffer);

          // String passend auf den Wert zusammenschneiden
          Result := Left(lFile.Strings[i], nEnd);

          if lFile <> nil then FreeAndNil(lFile);
          Exit;

        end;
      end;
    end;

    // Auf jeden Fall die verwendeten Ressourcen wieder auflösen, egal ob der
    // gesuchte Wert gefunden wurde oder nicht.
    if lFile <> nil then FreeAndNil(lFile);
  end;
end;

...

var
  lKey, Value: String;
  lKey := 'R1';
  lValue := GetValue('irgendeine Datei.txt', lKey);
var

Das sollte als erste Idee helfen, denke ich. Wie gesagt: Ich kann's vor Montag nicht mehr testen (oder ganz exakt: will es nicht mehr testen :) ), insbesondere bei den Indizes für die Pos() und RightStr() und LeftStr()-Sachen bin ich mir nicht so 100% sicher, da müsstest du ggf. nochmal in der Hilfe nachschauen.

Schönes Wochenende noch.



Nachtrag:
Sorry, habe gerade noch mal den Aufbau der Datendatei gesehen und da haut das so nicht so ohne weiteres hin mit dem geposteten Code. Wenn die Spalten deiner Datendatei immer exakt in dieser Reihenfolge angegeben sind (Value, Designator, Firma), dann kannst du den Wert einfacher extrahieren mit
Code:
Result := LeftStr(lFile.Strings[i], Pos(' '));
,
wobei jedoch der gesamte lBuffer nicht benötigt wird (ein Einsatz von lBuffer verhindert dann sogar ein korrektes Ergebnis).
Aber ich lasse auch mal den ursprünglichen Code stehen, bei dem ich irrtümlich von der Reihenfolge Designator, Value, Firma ausging.
Sollte die Spaltenreihenfolge variabel sein, dann gib nochmal Bescheid, da lässt sich sicher auch noch was finden.
 
Zuletzt bearbeitet:
Zurück