Nach Hause
Top.Mail.Ru Yandeks.Metrika
Forum: "Grundlagen";
Aktuelles Archiv: 2002.04.01;
Herunterladen: [xml.tar.bz2];

Nach unten

Meine Herren, helfen Sie beim Lesen von Daten aus Excel Finden Sie ähnliche Zweige


Санька   (2002-03-05 13:28) [0]

Das Problem ist wie folgt:
Der Kunde gibt die Excel-Datei, und ich übertrage alle Daten auf die lokale
DB zur Weiterverarbeitung. Es ist eine Schande, dass diese Datei nicht sehr gut in Zellen komponiert ist (anstatt automatisch zu übertragen)
viele Leerzeichen m / y Wörter und gedrückte Eingaben .... Beim Kopieren einer Spalte in eine Tabelle sehen all diese zusätzlichen Zeichen hässlich und nicht sehr korrekt aus. Wenn es hilft - hier ist der Code. Vielleicht wird es jemand erzählen.
Prozedur TForm1.BitBtn1Click (Sender: TObject);
var i, k: ganze Zahl;
n: string;
AppExcel, Value: Variant;
beginnen
i: = 6; // aus der sechsten zeile im buch von exel
AppExcel: = CreateOleObject ("Excel.Application");
AppExcel.Workbooks.Open ("c: \ 111.xls", False);
AppExcel.Visible: = True;
während ich <= 34 tue
beginnen
n: = AppExcel.Cells.item [i, 4] .Value;
taSS.edit;
taSS.insert;
taSs.fieldbyname ("Name"). AsString: = n;

taSS.post;
taSS.Next;
i: = i + 1;
end;
end;

Oder sag mir, wie ich das am besten organisieren kann ...
Wenn möglich, nicht an Sites senden D-Excel war bereits ...
Nun, ich habe es satt, denke ich. Vielen Dank im Voraus!!!



MetallAdm   (2002-03-05 16:38) [1]

Ist es möglich, zusätzliche Leerzeichen usw. zu entfernen?

n: = AppExcel.Cells.item [i, 4] .AsString; --- Sdesya auch, wie machst du String Wenn es String ist
taSS.edit;
taSS.insert;
DelSpaces (N); --- so wie das :))

taSs.fieldbyname ("Name"). AsString: = n;


Prozedur DelSpaces (Var xx: String);
war
i: Integer;
ll, l: Integer;
s: string;
b, a: Byte;
beginnen
s: = xx;
ll: = 1;
Lt: = Länge (S);
l: = 0;
a: = 0;
für i: = 1 zu tun
beginnen
if String (s [i]) = "" Then inc (l);
if String (s [i]) = "*" Dann a: = 1;
end;
Wenn l = lt Dann
beginnen
s: = "*";
a: = 1;
ll: = 1;
end;
wenn a = 0 Dann
beginnen
b: = 0;
Für i: = 2 geht nicht
beginnen
if String (s [i]) <> "" then
wenn b = 0 dann
beginnen
ll: = i;
b: = 1;
end;
end;
Wenn ll> 2 dann Setlength (s, ll) sonst s: = "*";
end;
xx: = s;
end;

Ja, zumindest Entoy-Verfahren
habe auch mal geschrieben weis nicht wie richtig es ist
lang war

Ja, ich habe nicht angefangen, es zu korrigieren. Sie markiert leere Zeilen mit einem Sternchen für Klarheit :)

Ich denke du wirst entfernen :)



Санька   (2002-03-05 17:29) [2]

Vielen Dank - ich werde es versuchen. Wenn Ihnen das wieder zusagt
(über die Sternchen :)).
Und zur Vereinfachung der Aufgabe tritt im Prinzip niemand auf
Gedanken. Jemand zu sein ist auf ein Problem gestoßen ...
Übrigens "denkt" der Computer in meinem Fall bei dieser Prozedur sehr lange (bis er alle Zellen auflistet, bis er sie in die Zeilen in der Tabelle einfügt)
Es wird sehr interessant sein, Ihre Meinung zu kennen, Spezialisten.



MetallAdm   (2002-03-05 17:47) [3]

Übrigens enta Verfahren entfernt
Nur vom Ende sind zusätzliche Leerzeichen

aber ich denke, es ist nicht schwierig, so etwas zu tun
das findet einzelne Wörter in einer Zeichenfolge
und schieben Sie sie in einer Reihe durch den Raum einer Mona in einer Zeile




Санька   (2002-03-06 09:05) [4]

Das ....
Ich glaube nicht, dass ich es schnell schaffen kann: so etwas wie Pascal
sauber (in Bezug auf die String-Verarbeitung) hatte nicht viel zu tun. Ich bin immer mehr in der DB. Nun, Lana - ich werde es versuchen ... Sanks.
Und andere Gedanken haben keine chtoli .... Au!



gek   (2002-03-06 09:40) [5]

Es scheint mir, wenn der Kunde dann eine Datei im CSV-Format gibt
es wird einfacher sein, Räume usw. wegzunehmen



MetallAdm   (2002-03-06 09:51) [6]

Sieh mal so aus wie ich es mal bei Turbo Squeak gemacht habe :))

U lädt die Textdatei und der Ruhm verschiebt sich in das Array
wählt einzelne Wörter aus einem Array aus
Nun, wenn es nicht klar ist, frage ich mich

Prozedur LoadFile (Var txt: POuts; Fl: String);
war
i, j, k: Wort;
s: Wort;
Buff: Array [1..lhtWord] von Byte;
bRead, bWrite: Word;
Sk, NumL: Word;
Strs: String;
beginnen
Zuweisen (Fls, Fl);
Reset (Fls, 1);
Größe: = Dateigröße (Fls);
Wenn Size <65000 dann
beginnen
BlockRead (Fls, lBuff ^, Size, bRead);
i: = 1;
Solange (i <= Size) und (lBuff ^ [i] = "") oder (lBuff ^ [i] = # 13) oder (lBuff ^ [i] = # 10) dies tun
beginnen
Inc (i);
end;
AddW: = 1;
k: = 0;
Für s: = i zu Size do
beginnen
j: = 0;
If (lbuff ^ [s] <> "") und (lBuff ^ [s] <> # 13) und (lBuff ^ [s] <> # 10) und (lBuff ^ [s] <> ".") Und (lBuff ^ [s] <> ",") Dann
beginnen
{Write (lbuff ^ [s]);}
Inc (k);
Strs [k]: = lbuff ^ [s];
Strs [0]: = Chr (k);
txt ^ [addW]: = Strs;
Ende
sonst
beginnen
j: = s;
k: = 0;
If (lBuff ^ [j] = ".") Or (lBuff ^ [j] = ",") Then
beginnen
{Strs [k]: = lbuff ^ [s];
Strs [0]: = Chr (k);}
If (lBuff ^ [j + 1] <> "") or (lBuff ^ [j + 1] <> # 13) or (lBuff ^ [j + 1] <> # 10) Then
beginnen
Inc (AddW);
s: = j;
end;
Ende
sonst
beginnen
Solange (lBuff ^ [j] = "") oder (lBuff ^ [j] = # 13) oder (lBuff ^ [j] = # 10) dies tun
beginnen
Inc (j);
{Wenn (lBuff ^ [j] = # 13) oder (lBuff ^ [j] = # 10), dann schreibe ("|"), sonst schreibe ("+");}
end;
Inc (AddW);
s: = j-1;
end;
end;
end;
end;
end;


Heh langes Verfahren :))



Shirson   (2002-03-06 12:50) [7]

Hmm ...
XL hat zwei solche Funktionen:
1. Bereinigen (Text) Entfernt alle nicht druckbaren Zeichen aus dem Text (Zeilenvorschub verweist auf sie).
2. Beschneiden (Text) Entfernt alle Leerzeichen zwischen Wörtern aus dem Text, mit Ausnahme einzelner Leerzeichen.

Insgesamt um = Trimmen (Reinigen (A1)) Lange Prozeduren können vermieden werden :)



Санька   (2002-03-06 14:10) [8]

> Shirson
Erklären Sie bitte, ob diese Funktionen direkt in Excel ausgeführt werden oder ob Mona von Delphi aus aufgerufen wird.



Shirson   (2002-03-06 14:35) [9]

> Sanka

Sie können direkt in XL. Sie können auch von Delphi - jede Zelle mit der Formel in XL bekommen = Trimmen (Reinigen (A1)), ersetze nur alle Zellen, die anstelle von A1 verarbeitet werden müssen, und lese die Daten in Delphi und wirf sie in die Datenbank ... ähm .. es ist nur nicht klar, warum die Stufe mit Delphi hier benötigt wird :) Du kannst Daten direkt aus XL in die Datenbank werfen :) )))



Санька   (2002-03-06 14:45) [10]

> Shirson
Ich werde es versuchen, danke ...
Was die direkte Übertragung in die Datenbank betrifft: Sie müssen Excel-Tools verwenden, und meine Juver raten nicht ... Wenn sich die Daten wiederholen, kann ich dies nur schwer nachvollziehen. Und so - ich kopiere in die Zwischendatenbank, und dann mache ich es mit SQL-Tools und wähle aus, was ich als Hauptprogramm haben möchte ... Im Allgemeinen ist das Projekt ziemlich dumm :) Das Hauptprogramm hat lange gearbeitet und alles wurde getestet, aber aus Langeweile fange ich an, neue Vereinfachungen für Benutzer zu finden.
Nun, ich werde weiter leiden. Danke an alle!!! Geholfen
Bald werde ich wohl wieder abbiegen. ;)



Санька   (2002-03-06 15:13) [11]

> Shirson
Übrigens habe ich Folgendes versucht:

n: = AppExcel.Cells.item [i, 4] .Value;
Beschneiden (n); - es funktioniert, löscht Leerzeichen
Reinige (n); - und dieses df ist Delphi unbekannt

Vielleicht wird etwas diese Funktion ersetzen. In einer Hilfe zur Arbeit mit Leitungen stöberte - nichts :(. ???????



TIP   (2002-03-06 15:31) [12]

Und für Delphi gibt es eine hervorragende Qstrings-Bibliothek
Arbeiten Sie außerdem mit Strings im Assembler.



Shirson   (2002-03-06 15:35) [13]

Im Allgemeinen werden in Delphi (zumindest in D6) mit der Trim-Funktion Leerzeichen am Anfang einer Zeile, am Ende einer Zeile und alle Steuerzeichen aus der Zeile selbst entfernt. (Wie hast du die Hilfe durchwühlt? :))
Versuchen Sie die Linie nur mit Trimmen zu trimmen - was passiert?



Shirson   (2002-03-06 15:40) [14]

> Sanka
"Was die direkte Übertragung in die Datenbank betrifft: Es geht darum, dies mit Excel-Tools zu tun, aber mein Juver ahnt es nicht ... Wenn sich die Daten wiederholen, kann ich sie nur schwer nachverfolgen."

Der Besitzer ist der Meister :) Ich hätte den Garten nicht eingezäunt, sondern alles in XL gemacht. Und die Benutzer müssten einen Zuhälter drücken, ohne über den Mechanismus des Systems nachzudenken. Und dann gibt es eine Prüfung, die Sie durchführen und die Benutzeroberfläche usw. verdrehen möchten. Aber wenn Sie das Delphi verwenden möchten, müssen Sie :)



Санька   (2002-03-06 16:21) [15]

:))))))) Ja, ich dachte, dass ich vor langer Zeit Dummies hinterlassen habe ... :)
Arbeiten Sie beispielsweise mit Strings, und trim ist ein Assembler-Chip.%)
kürzer als %% (((.
Naja, s, mit Linien von Löchern mit Linien ... Ich kann nichts anderes finden als verbinden, nach Zeichen suchen usw. usw., aber Leerzeichen und "Eingaben" und "Tabulatoren" und einen Igel mit ihnen entfernen. Ich sehe nichts als Borte.
Wenn Sie es dem unglücklichen Programmierer sagen - danke.
Wenn nicht, werde ich Englisch lernen und D für Dummies kaufen :))
Und danke nochmal an alle, danke, ich wollte mich betrinken !!!




dmitryK   (2002-03-06 18:13) [16]


> Und was die Vereinfachung der Aufgabe betrifft, so entsteht im Prinzip niemand
> gedanken. Jemand zu sein ist auf ein Problem gestoßen ...
> Übrigens, in meinem Fall "denkt" der Computer bei dieser Prozedur
> eine sehr lange Zeit (während alle Zellen durchlaufen werden, bis in den Zeilen in
> das Board wird eingefügt)
> Es wird sehr interessant sein, Ihre Meinung zu wissen, Spezialisten.


Kein Wunder, dass er so lange denkt. Der Code ist langsam.
Kurz gesagt, wie man optimiert. Dies ist der Quellcode:


> procedure TForm1.BitBtn1Click (Sender: TObject);
> var i, k: ganze Zahl;
> n: string;
> AppExcel, Wert: Variant;
> beginnen
> i: = 6; // aus der sechsten zeile im buch von exel
> AppExcel: = CreateOleObject ("Excel.Application");
> AppExcel.Workbooks.Open ("c: \ 111.xls", False);
> AppExcel.Visible: = True;
> während ich <= 34 mache
> beginnen
> n: = AppExcel.Cells.item [i, 4] .Value;
> taSS.edit;
> taSS.insert;
> taSs.fieldbyname ("Name"). AsString: = n;
>
> taSS.post;
> taSS.Next;
> i: = i + 1;
> ende;
> ende;


AppExcel.Visible: = True; - warum ist das ?? was würde langsamer arbeiten?
Dieser Code weist auf die Notwendigkeit hin, den Prozess der Arbeit mit XL zu visualisieren, was die Arbeit natürlich verlangsamt.

n: = AppExcel.Cells.item [i, 4] .Value; - Der Code aus dem Lehrbuch ist absolut korrekt, aber absolut hemmend. Ich weiß nicht genau, wie es funktioniert (auf Betriebssystemebene), aber es spielt absolut keine Rolle, wie viele Daten Sie von der Buchseite herunterladen - eine Zelle oder 1000. Dazu legen Sie dort ein dynamisches Array der gewünschten Größe und des gewünschten Lastbereichs an.
Und erst dann analysieren Sie dieses Array, das an sich viel schneller ist.

Aber dieser Code ist mir nicht ganz klar
> taSS.edit;
> taSS.insert;
> taSs.fieldbyname ("Name"). AsString: = n;
>
> taSS.post;
> taSS.Next;

versuchen, bestehende Leitungen zu ersetzen? obwohl es so war, als würde man über das Hinzufügen neuer sprechen ?? In jedem Fall ist es jedoch oft schneller, die gesamte SQL-Abfrage zu generieren und auszuführen. Da dem Code zufolge weniger als 30-Zeilen auf einmal erwartet werden, ist es möglich, das gesamte Paket von Änderungen (30-SQL-Abfragen zum Ändern / Hinzufügen) auf einmal zu senden, wodurch auch die Ausführungszeit der Aufgabe verkürzt wird.

und zuletzt
i: = i + 1; - Es ist besser, ein solches Fragment durch Inc (i) zu ersetzen.

Tipps zur Optimierung der Geschwindigkeit des Datenzugriffs in XL finden Sie auf der Kingdom of Delphi-Website und in den Artikeln „On the Waves of Integration“. Alles, was ich hier kurz erwähnt habe, ist dort sehr ausführlich beschrieben. Lies es.

Was das Entfernen von zusätzlichen Leerzeichen angeht, ist dieses Problem nichts wert. Ich weiß nicht, was D6 angeht, aber vor TRIM habe ich nur führende und nachfolgende Leerzeichen abgeschnitten. Wenn er jetzt immer noch das Pluszeichen entfernt, dann ist alles im Allgemeinen einfach. Wenn nicht, müssen Sie eine halbe Stunde aufwenden, um sie selbst zu löschen.



dmitryK   (2002-03-06 18:16) [17]


> TIPP (06.03.02 15: 31)
> Aber für Delphi gibt es eine exzellente Qstrings-Bibliothek
> arbeiten Sie außerdem mit Strings im Assembler.


Übrigens ein sehr nützlicher Tipp, den ich sehr empfehlen kann.



MetallAdm   (2002-03-06 18:57) [18]

heh ja ich denke deine frage nach optimierung ist schon aufgetaucht :)

> Shirson wusste es übrigens nicht, wusste es nicht :)
Ich kann mich immer noch nicht von den Dos-Zeiten entwöhnen, die ich nicht kann
wenn irgendwelche Programme von Grund auf neu gemacht werden mussten :))



Seiten: 1 ganze Branche

Forum: "Grundlagen";
Aktuelles Archiv: 2002.04.01;
Herunterladen: [xml.tar.bz2];

nach oben





Speicher: 0.64 MB
Zeit: 0.029 c
3-72
Narik
2002-03-10 17:13
2002.04.01
Kurzbericht


6-256
Yuraz
2002-01-17 18:30
2002.04.01
Es gibt einen HTML-Code, den ich zumindest primitiv in eine visuelle Seite umwandeln möchte.


3-6
Malder
2002-03-05 19:23
2002.04.01
Wie storniere ich eine Transaktion in einem Trigger?


1-94
qqshka
2002-03-21 12:36
2002.04.01
Befehlszeilenargumente


4-348
MJH
2002-01-28 02:44
2002.04.01
LISTBOX & PageControl





Afrikanisch Albanien Arabisch Armenisch Aserbaidschanisch Baskisch Weißrusse Bulgarisch katalanisch Chinesisch (vereinfacht) Chinesische Tradition) kroatisch Tschechisch Dänisch Niederländisch Englisch estnisch Philippinisch Finnisch Französisch
Galicisch Georgisch Deutsch Griechisch haitian Creole Hebräisch Hindi ungarisch isländisch Indonesian irisch Italian Japanisch Koreanisch lettisch litauisch Makedonisch Malay Maltesisch Norwegisch
persisch Polnisch Portugiesisch Rumänisch Russisch serbisch Slovakisch Slowenisch Spanisch Suaheli Schwedisch Thai Türkisch Ukrainisch Urdu Vietnamesisch Walisisch Jiddisch Bengalisch bosnisch
cebuano Esperanto Gujarati Hausa Hmong igbo Javanisch kannada Khmer Laotisch Lateinisch Maorisch Marathi Mongolisch nepali Pandschabi Somalisch Tamilisch Telugu Yoruba
Zulu
Английский Französisch Deutsch Italienisch Португальский Russisch Spanisch