Forum: PC-Programmierung VBA regex Pattern, Datenblatt auslesen


von NotVBAgeek (Gast)


Lesenswert?

Hallo zusammen,
ich hoffe jemand kann mir helfen, ich möchte eine Datenblatt (pdf) 
auslesen und bestimmt Werte in ein Exceldokument laden. Das ganz 
funktioniert auch schon so halb, nur habe ich Probleme beim einlesen 
mancher Werte.
Aber noch kurz zum ablauf, ich konvertiere das PDF Dokument zu einer TXT 
Datei mit pdftotxt.exe und durchsuche die dann eben nach bestimmten 
Strings wie zum Beispiel (jetzt mal von einem FET Datenblatt) "Input 
capacitance" (Ciss)
Jetzt kann dieser Wert allerdings einstellig also z.B. "2", zweistellig 
z.B. "20", oder "2.0" sein

Die Zeile sieht nach dem Umwandeln in txt so aus:
Input capacitance (viele Leerzeichen) C iss (viele Leerzeichen) - 
(wenige Leerzeichen) 13 (wenige Leerzeichen) 20

Wie kann ich jetzt mit den Pattern die obrigen drei Fälle abdecken (in 
einer Zeile, ohne If else)
Ich möchte auch immer nur den maximal Wert auslesen, in dem fall also 
die 20

Ich wäre wirklich sehr dankbar wenn da jemand helfen könnte.

von NotVBAgeek (Gast)


Lesenswert?

Hatte oben die falsche Zeile kopiert, hier ist es etwas schwieriger, da 
hier auch die 25 ausgelesen werden, was ich aber nicht brauche. Dafür 
aber die 6 weggelassen werden, die ich eigentlich brauche.

Output capacitance               C oss      V GS=0 V, V DS=25 V,   - 
4.1     6

Mein Pattern sieht momentan so aus
regex.Pattern = "Output 
[Cc]ap.*[^\r\n]+(\d[\.]?[\d]?[^\s]).*[^\d](\d[\.]?[\d]?[^\s])"

von T. Regex der PCREdiger (Gast)


Lesenswert?

1
$ LINIE='Output capacitance C oss V GS=0 V, V DS=25 V, -4.1 6'
2
$ 
3
$ echo "$LINIE" ¦ grep -oP '\S[\.\d]+\s*$'
4
6
5
$
6
$ LINIE='Output capacitance C oss V GS=0 V, V DS=25 V, -4.1 16'
7
$ 
8
$ echo "$LINIE" ¦ grep -oP '\S[\.\d]+\s*$'
9
16
10
$
11
$ LINIE='Output capacitance C oss V GS=0 V, V DS=25 V, -4.1 16.4'
12
$ 
13
$ echo "$LINIE" ¦ grep -oP '\S[\.\d]+\s*$'
14
16.4
15
$
16
$ LINIE='Output capacitance C oss V GS=0 V, V DS=25 V, -4.1 .7'
17
$ 
18
$ echo "$LINIE" ¦ grep -oP '\S[\.\d]+\s*$'
19
.7
20
$

Sorry no VBA, standards compliant tools only.

von NotVBAgeek (Gast)


Lesenswert?

Ich habe es inzwischen geschafft nur den letzten Wert auszulesen (der 
mich eigentlich auch nur interessiert)

Das Pattern zu der Zeile

"Input capacitance                C iss                             - 
13      20    pF"

lautet

"Input [Cc]ap.*[^\n\r]+[ ]+([\d\.]{1,})([ ]+)?"



Und für RDSon, bei dem auch noch UGS ausgelesen werden soll

"Drain-source on-state resistance       R DS(on)    V GS=4.5 V, I D=0.25 
A      -         2.0         4     "

"[Dd]rain.*[Rr]es.*[^\n\r]+= ?([\d\.]{1,}) ?V.*[^\n\r]+[ 
]+([\d\.]{1,})([ ]+)?"

von NotVBAgeek (Gast)


Lesenswert?

Hallo,
ich habe nochmal so ein Sonderfall und hoffe jemand kennt sich da etwas 
besser damit aus als ich.

Ich habe folgenden String in meinem Textdokument:
RDS(on)        Static Drain-to-Source On-Resistance  ---  ­­­  --- ­­­ 
0.025         VGS = 10V, ID = 29A
und in einem anderen Datenblatt eines anderen Herstellers:
Drain-source on-state resistance       R DS(on)    V GS=4.5 V, I D=0.25 
A      -         2.0         4

Auslesen möchte ich einmal natürlich den Widerstand, also im ersten Fall 
0,025 und im zweiten 4 (ich will immer den Maximalwert). Zusätzlich 
möchte ich noch die Spannung bei der das gemessen wurde auslesen (später 
auch optiononal noch den Strom, aber das ist jetzt erst einmal egal)

Mein Pattern sieht momentan wie folgt aus:
regex.Pattern = "[Dd]rain.*[Oo]n.*[^\n\r]+=[ ]*([\d\.]{1,}) ?V.*[^\n\r]+ 
[ ]+([\d\.]{1,})([ ]+)?"


Mein Problem ist das er nun bei dem ersten Datenblatt die 10V zwar 
erkennt, aber dann natürlich die 29 als Widerstand erkennt und nicht die 
0,025...
Für das zweite Datenblatt funktioniert der Pattern.
Wie muss ich den Pattern nun anpassen, dass er Spannung und Strom vor 
und nach dem Widerstandswert erkennt?

von c-hater (Gast)


Lesenswert?

NotVBAgeek schrieb:

> Mein Problem ist das er nun bei dem ersten Datenblatt die 10V zwar
> erkennt, aber dann natürlich die 29 als Widerstand erkennt und nicht die
> 0,025...
> Für das zweite Datenblatt funktioniert der Pattern.
> Wie muss ich den Pattern nun anpassen, dass er Spannung und Strom vor
> und nach dem Widerstandswert erkennt?

Dein Problem ist nicht, was dein Pattern matched, sondern offensichtlich 
die Tatsache, dass du keine Ahnung hast, was du da eigentlich tust.

Lerne RE's, dann weißt du erstens, wie du die RE für dein Problem 
umformulieren musst, und zweitens, dass RE's immer nur so intelligent 
und anpassungsfähig sein können wie ihre Verfasser.

Merke: eine RE ist keine KI... Nichtmal näherungsweise...

von NotVBAgeek (Gast)


Lesenswert?

c-hater schrieb:
> NotVBAgeek schrieb:
>
>> Mein Problem ist das er nun bei dem ersten Datenblatt die 10V zwar
>> erkennt, aber dann natürlich die 29 als Widerstand erkennt und nicht die
>> 0,025...
>> Für das zweite Datenblatt funktioniert der Pattern.
>> Wie muss ich den Pattern nun anpassen, dass er Spannung und Strom vor
>> und nach dem Widerstandswert erkennt?
>
> Dein Problem ist nicht, was dein Pattern matched, sondern offensichtlich
> die Tatsache, dass du keine Ahnung hast, was du da eigentlich tust.
>
> Lerne RE's, dann weißt du erstens, wie du die RE für dein Problem
> umformulieren musst, und zweitens, dass RE's immer nur so intelligent
> und anpassungsfähig sein können wie ihre Verfasser.
>
> Merke: eine RE ist keine KI... Nichtmal näherungsweise...

Danke für deine Antwort, ich weiß das ich mit RE noch nicht wirklich gut 
umgehen kann. Aber nachdem ich die Lösung für das Problem doch recht 
schnell brauche, wäre es wirklich nett richtige Hilfe zu leisten...
Ich hatte dabei an sinnvolle Denkanstöße oder Code Stücke gedacht und 
weniger an unproduktive verbale nonsens Ausscheidungen.

Wäre wirklich nett wenn jemand, der sich mit regex Pattern schon mal 
beschäftigt hat, mir helfen könnte. Danke :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.