Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Excel - kyrillischen Text auswerten (https://www.delphipraxis.net/171447-excel-kyrillischen-text-auswerten.html)

Gerd L 7. Nov 2012 07:59

Delphi-Version: 5

Excel - kyrillischen Text auswerten
 
Hallo,
hier das Problem
Ich habe in einer Excel-Zelle den Monat in kyrillichen Buchstaben und brauche die Monatszahl. Wie kann ich den Monat ermitteln?

In der Excel-Zelle steht:
'№ 8888 от 31 октября 2012 г.'
In dem WideString steht:
'? 8888 ?? 31 ??????? 2012 ?.'

var
ws:widestring;
whv:variant;

....
whv:=Sheet.Cells[13,2].value2;
Sheet.Cells[13,40].value2:=whv;
ws:=vartowidestr(whv);

Ich nutze dafür Delphi6PE!

Vielen dank im Voraus
Gerd

sx2008 7. Nov 2012 08:12

AW: Excel - kyrillischen Text auswerten
 
Zitat:

Zitat von Gerd L (Beitrag 1190089)
Als Ergebnis in WS steht:
'? 8888 ?? 31 ??????? 2012 ?.'

Wie kommst du darauf bzw. wo liest du diesen Text?
Der in der IDE von Delphi 5 integrierte Debugger ist natürlich nicht unicode-fähig und wandelt Widestrings vor der Anzeige ist Ansistrings um.

Gerd L 7. Nov 2012 08:37

AW: Excel - kyrillischen Text auswerten
 
Hallo SX2008,
ich habe die falsche Version angegeben - es ist Delphi6PE.

Wandelt es nur die Anzeige?
Nur wie komme ich an was auswertbarem, sowas wie der Ordinatszahl? Ich brauche letztlich nicht die Anzeige, sondern die entsprechende Monatsnummer. Ich habe auch schon die Anzahl der '?' geprüft, also sowas wie die Länge des Monatsnamens, aber da haben z.B. Januar, April und November jeweils 6 Stellen.

Gerd

himitsu 7. Nov 2012 09:15

AW: Excel - kyrillischen Text auswerten
 
Wobei du das ja auch noch ändern könntest (bearbeiten > erweitert) und/oder du gibst es gleich in deinem Profil an.

Aber egal ob D5 oder D6, beide Belphis können kein Unicode (in der RTL, VCL, abgesehn won ein paar Funktionen, wo WideString verwendet wird, anstatt des AnsiString/String)


Du kannst dich nur mit CodePages abkämpfen.

oder

Programminterne ebenfalls mit CodePages arbeiten (mit einer CodePage, welche die entsprechenden kyrillischen Zeichen enthält), bzw. den WideString verwenden
und für die Anzeige z.B. sowas wie die TNT Unicode Controls nutzen.

Gerd L 7. Nov 2012 09:58

AW: Excel - kyrillischen Text auswerten
 
Hallo sx2008 und Himitsu,
ihr habt mir beide weitergeholfen.
sx2008 damit, dass das, was man sieht, nicht alles ist. Ich war da nur gar nicht drauf gekommen, weil im Fenster 'Watch List' der angezeigte Inhalt von whv und ws so unterschiedlich war. Und Himitsu mit seiner Funktion CopyW.
Ich werde dann noch mal den fertigen Teil mitteilen.

Gerd

Gerd L 7. Nov 2012 14:06

AW: Excel - kyrillischen Text auswerten
 
So, hier nun mal, wie ich das auswerte:
Ich nehme die ersten 3 Stellen, Count braucht man als Parameter da eigentlich nicht, aber ich will noch anderes Zeugs auswerten.
Ich baue aus den kyrillischen Zeichen eine Zeichenkette im 'normalen' ASCII-Zeichensatz und diese kann ich dann vergleichen.
Also es wird nichts übersetzt. Die ersten drei Stellen sind eindeutig, wenn man weiß, dass da nur eine Monatsangabe kommt.

Function RuMoNameZuMoNr(S: WideString ; Count: LongInt): integer;
type t_ma=record
case byte of
0:(b:array[0..10] of byte);
1:(c:array[0..10] of char);
end;

var t:t_ma;
n:byte;
mon:integer; // = Monatszahl oder <=0 bei Fehler
mons:string;
Begin
fillchar(t,sizeof(t),$0);
Count:=3; // ich werte die ersten 3 Buchstaben aus
If Count < 0 Then Count := 0;
If Count > Length(S) Then Count := Length(S);
If Count > 0 Then Begin
Move(S[1], t.b[0], Count shl 1);
End;
mon:=0;
mons:='';
for n:=0 to pred(count) do begin
if t.b[n*2+1]<>4 then dec(mon); // 04 - kyrillischer Zeichensatz, wenn nicht, dann wird 'mon' negativ
end;
if mon=0 then begin
for n:=0 to pred(count) do begin
if t.b[n*2]<$30 then t.b[n*2]:=t.b[n*2] + $20; // alles in Kleinbuchstaben wandeln, damit egal wie es kommt
mons:=mons+t.c[n*2];
end;
if mons='O=2' then mon:=1;
if mons='D52' then mon:=2;
if mons='<0@' then mon:=3;
if mons='0?@' then mon:=4;
if mons='<0O' then mon:=5;
if mons='8N=' then mon:=6;
if mons='8N;' then mon:=7;
if mons='023' then mon:=8;
if mons='A5=' then mon:=9;
if mons='>:B' then mon:=10;
if mons='=>O' then mon:=11;
if mons='45:' then mon:=12;
end;
RuMoNameZuMoNr:=mon;
End;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:57 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