xsto123
Goto Top

PDF auslesen und per VBA in Excel schreiben

Hallo zusammen,

ich bin auf der Suche nach einer Möglichkeit Daten automatisiert aus einem PDF auszulesen und in eine Excel-Tabelle zu schreiben.
Konkret geht es um folgende PDF: http://www.gtai.de/GTAI/Content/DE/Trade/Fachdaten/MKT/2008/07/mkt20080 ...

Hier möchte ich z.B. den Wert
- "Fläche:" "357.137,0 qkm"
- "Einwohner:" "2013" "80,5 Millionen"
usw.

in einzelnen Spalten einer Excel haben.

Ich habe bereits über Google nach einer Lösung gesucht und bin dabei auf dieses Forum gestoßen, nämlich auf diesen Beitrag: Pdf auslesen und in excel schreiben

Hier scheint es einen Lösungsansatz zu geben, allerdings funktioniert das bei mit leider nicht. Selbstverständlich habe ich Zeile 15, also den Suchbegriff, an meine PDF angepasst (Einwohner), aber es tut sich leider gar nichts. Ich arbeite mit Office 2010.

Kennt jemand eine Lösung für mein Problem bzw. könnte man das Script aus oben genannten Beitrag irgendwie an meine Bedürfnisse anpassen?
Ich wäre euch zu ewigem Dank verpflichtet, da ich sonst jedes PDF von jedem Land öffnen müsste und die gewünschten Daten herauskopieren müsste.

Vielen Dank bereits im Voraus für eure Hilfe.

Content-ID: 239601

Url: https://administrator.de/contentid/239601

Ausgedruckt am: 22.11.2024 um 13:11 Uhr

colinardo
colinardo 30.05.2014, aktualisiert am 13.04.2024 um 08:54:57 Uhr
Goto Top

##edit## Wer aktuellere Varianten für das Auslesen von PDF Dokumenten bevorzugt sollte sich dazu diese Beiträge ansehen


Hallo xsto123, Willkommen auf Administrator.de!
Also du packst die pdftotext.exe (aus dem Paket: Xpdf command line tools) in den Ordner deines Excel-Files und die auszulesenden PDF-Dateien ebenfalls in diesen Ordner. Dann kopierst du den Code von unten in dein Excel-File in den VBA-Editor (ALT-F11). Stelle bitte auch sicher das im Sicherheitscenter von Excel das Ausführen von Makros aktiviert ist!
Dann kannst du die Files hiermit auslesen wenn du im VBA-Editor das Makro ausführst: (WICHTIG: in diesem Beispiel wird nur das Land und die Fläche ausgelesen, das musst du dann noch um die gewünschten Felder erweitern, dies wird entsprechend mit Regular-Expressions aus den Textdateien extrahiert)
Sub PDF2Excel()
    Dim i As Integer
    Dim strCMDLine As String, strTXT As String
    Dim FSO As Object, objSFold As Object, objWks As Object, WSHShell As Object, file As Object, rngLastRow As Range
    Dim colPFiles As New Collection, colTFiles As New Collection, regex As Object
    
    Set WSHShell = CreateObject("WScript.Shell")  
    Set FSO = CreateObject("Scripting.FileSystemObject")  
    Set regex = CreateObject("vbscript.regexp")  
    regex.MultiLine = True
    Set objSFold = FSO.GetFolder(ThisWorkbook.Path)
    
    strCMDLine = """" & ThisWorkbook.Path & "\pdftotext.exe"" -raw -layout -nopgbrk "  
        
    For Each file In objSFold.Files                                  ' alle Dateien einlesen  
        If Right(file.Path, 4) = ".pdf" Then colPFiles.Add file.Path  ' nur *.pdf  
    Next
    
    For i = 1 To colPFiles.Count
         WSHShell.Run strCMDLine & """" & colPFiles.Item(i) & """", 0, True  
    Next
    
    For Each file In objSFold.Files                                  ' wieder alles einlesen  
        If Right(file.Path, 4) = ".txt" Then colTFiles.Add file.Path  ' nur *.txt  
    Next
    
    Set objWks = Worksheets(1)
    Set rngLastRow = objWks.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
    
    For i = 1 To colTFiles.Count
        strTXT = FSO.OpenTextFile(colTFiles.Item(i)).ReadAll
        
        'Land auslesen  
        regex.Pattern = "^Wirtschaftsdaten kompakt: ([^\r\n]+)"  
        Set matches = regex.Execute(strTXT)
        If matches.Count > 0 Then
            rngLastRow.Cells(1, 1).Value = matches(0).submatches(0) 'Land in Spalte A speichern  
        End If
        
        ' Fläche auslesen  
        regex.Pattern = "^Fläche\s*([^\r\n]+)"  
        Set matches = regex.Execute(strTXT)
        If matches.Count > 0 Then
            rngLastRow.Cells(1, 2).Value = matches(0).submatches(0)     'Fläche in Spalte B Speichern  
        End If
        
        Set rngLastRow = rngLastRow.Offset(1, 0)
        'Textdatei löschen  
        Kill colTFiles.Item(i)
    Next
    Set FSO = Nothing
    Set regex = Nothing
    Set WSHShell = Nothing
    Set objSFold = Nothing
End Sub
Grüße Uwe
xsto123
xsto123 30.05.2014 um 14:53:34 Uhr
Goto Top
Hallo Uwe,

wow, das ist der Hammer. Das funktioniert perfekt und genau so, wie ich es mir gewünscht, aber niemals für möglich gehalten hätte. Vielen, vielen Dank.

Ich habe eben mal versucht das Script um "Einwohner" zu erweitern, um das Prinzip zu verstehen. Folgendes habe ich gemacht:

' Einwohner auslesen
regex.Pattern = "^Einwohner\s*([^\r\n]+)"
Set matches = regex.Execute(strTXT)
If matches.Count > 0 Then
einwohner = matches(0).submatches(0)
rngLastRow.Cells(2, 2).Value = matches(0).submatches(0) 'Fläche in Spalte B Speichern
End If

Das funktioniert auch, allerdings steht nun in einer Spalte "2013: 80,5 Millionen". Ist es möglich, dass die Jahreszahl und der eigentliche Wert (80,5 Millionen) in einzelnen Zellen eingetragen werden?

Und was wahrscheinlich wirklich nicht funktionieren wird, ist bestimmt, dass der Wert alleine ohne Maßangabe steht, also "357.137,0" ohne "qkm", "80,5" ohne "Millionen", usw., sodass ich die Daten in der Excel weiterverarbeiten kann. Oder?

Ich werde mich nun am Wochenende mit dem Thema beschäftigen und am Montag im Büro noch mal nachschauen, welche Daten ich genau brauche. Ich muss nämlich leider auch noch Daten aus anderen PDFs übertragen, daher versuche ich das Prinzip zu verstehen, damit ich es bestenfalls übertragen kann. face-smile

Ich danke dir auf jeden Fall vielmals für deine Mühe und wünsche ein schönes WE.
colinardo
colinardo 30.05.2014 aktualisiert um 15:19:21 Uhr
Goto Top
Mit Regular Expressions geht fast alles, außer Kaffee kochen face-smile

Und was wahrscheinlich wirklich nicht funktionieren wird, ist bestimmt, dass der Wert alleine ohne Maßangabe steht, also "357.137,0" ohne "qkm", "80,5" ohne "Millionen", usw., sodass ich die Daten in der Excel weiterverarbeiten kann. Oder?
Kein Problem, der Pattern in diesem Fall lautet:
regex.Pattern = "^Einwohner\s*(\d{4}): ([^\s]+) ([^\s]+)"
dann kannst du hiermit die Teile aufsplitten:
jahr = matches(0).submatches(0)
zahl = matches(0).submatches(1)
einheit = matches(0).submatches(2) 
Die Klammern im Regex legen die Submatches fest, so lässt sich das ganze separaten Variablen zuordnen und weiterverarbeiten.

Wenn man den Regex-Ausdruck ausschreibt, würde sich das so lesen:
Assert position at the beginning of a line (at beginning of the string or after a line break character) «^»
Match the characters “Einwohner” literally «Einwohner»
Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) «\s*»
   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
Match the regular expression below and capture its match into backreference number 1 «(\d{4})»
   Match a single digit 0..9 «\d{4}»
      Exactly 4 times «{4}»
Match the characters “: ” literally «: »
Match the regular expression below and capture its match into backreference number 2 «([^\s]+)»
   Match a single character that is a “non-whitespace character” «[^\s]+»
      Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
Match the character “ ” literally « »
Match the regular expression below and capture its match into backreference number 3 «([^\s]+)»
   Match a single character that is a “non-whitespace character” «[^\s]+»
      Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»

Für Tests mit Regex lass dir mal ein PDF mit pdftoexe die Textdatei ausgeben, dann siehst du genauer wie das File formatiert ist.

Für das Beispiel-PDF
pdftotext.exe -raw -layout -nopgbrk mkt200807555574_159860.pdf
Anhand dessen lässt sich dann der entsprechende Pattern aufbauen.

Grüße Uwe
xsto123
xsto123 30.05.2014 um 17:15:32 Uhr
Goto Top
Super, vielen Dank. Da habe ich ja einiges zu lesen und auszuprobieren. Aber selbst lernen ist sowieso immer am besten face-smile
Ich werde mich bei Problemen und Fragen, die mit Sicherheit auftauchen werden, wieder hier im Thread melden.

Vielen Dank noch mal für deine freundliche und kompetente Unterstützung. Tolles Forum hier face-smile

Viele Grüße
xsto123
xsto123 31.05.2014 um 17:53:02 Uhr
Goto Top
Hallo noch mal,

ich habe nun fast den ganzen Samstag damit verbracht und kam auch ganz gut voran. Nur die Regular Expressions machen mir doch ganz schön zu schaffen. Die sind leider für einen Anfänger nicht ganz so leicht zu verstehen.

Ich habe mir jetzt mal noch eine zweite PDF besorgt (http://www.gtai.de/GTAI/Content/DE/Trade/Fachdaten/MKT/2014/05/mkt20140 ..) und wollte mich mal an die Rohstoffe wagen. Folgendes habe ich ins Script eingefügt:

' Rohstoffe auslesen
regex.Pattern = "^Rohstoffe\s* ([^\s]+) ([^\r\,\n]+)"
Set matches = regex.Execute(strTXT)
If matches.Count > 0 Then
art = matches(0).submatches(0)
rohstoff = matches(0).submatches(1)
rngLastRow.Cells(1, 6).Value = matches(0).submatches(0) 'Art speichern
rngLastRow.Cells(1, 7).Value = matches(0).submatches(1) 'Rohstoff speichern
End If

Das funktioniert soweit auch, allerdings wird mir als "art" nur der Wert "agrarisch" ausgegeben und als "rohstoff" nur "Opium".

Ich hätte gerne jeden Rohstoff einzeln, sodass ich jeden einzelnen in eine Zelle ablegen kann.
Außerdem springt er leider auch nicht eine Zeile weiter auf "mineralisch".

Wäre über jede Hilfe dankbar.

PS. Gibt es eventuell irgendwo eine gute Übersicht über alle Regular Expressions, die man verwenden kann?

Viele Grüße und noch mal vielen Dank
colinardo
colinardo 31.05.2014, aktualisiert am 01.06.2014 um 08:16:23 Uhr
Goto Top
Hallo,
da hast du dir auch einen nicht so einfachen Fall für den Anfang herausgesucht ! Das Problem was ich gerade bemerke ist, dass der pdftotext-Interpreter je nach PDF mit den jetzigen Parametern keine konsistenten Textdateien erzeugt (die Daten in den rechten Spalten sind dann teilweise mehrfach nach unten versetzt und nicht mehr zuzuordnen) mit denen sich das einigermaßen zuverlässig extrahieren ließe.

Beispiel für dein PDF mit Afghanistan(du siehst alles etwas nach unten verschoben, so nicht handlebar):
Wirtschaftsdaten kompakt: Afghanistan

Stand: April 2013

Basisdaten

Fläche                               652.230,0 qkm
Einwohner
Bevölkerungsdichte                   2013: 30,6 Millionen *
Bevölkerungswachstum
Geburtenrate                         2013: 46,9* Einwohner/qkm
Fertilitätsrate
Altersstruktur                       2013: 2,2%

Analphabetenquote                    2013: 39,0 Geburten/1.000 Einwohner

Rohstoffe        agrarisch           2012: 5,1 Geburten pro Frau

                 mineralisch         2014: 0-14 Jahre: 42%; 15-24 Jahre: 22,2%; 25-54 Jahre:
                                     29,4%; 55-64 Jahre: 2,5%; 65 Jahre und älter: 2,5%
Mitglied in internationalen
Wirtschaftszusammenschlüssen und     2000: 71,9%
-abkommen
                                     Opium, Weizen, Früchte, Nüsse, Wolle, Hammel, Schafsfell,
Währung          Bezeichnung         Lammfell
                 Kurs (März 2014)
                 Jahresdurchschnitt  Erdgas, Erdöl, Kohle, Kupfer, Chromit, Talk, Baryt, Schwefel,
                                     Blei, Zink, Eisenerz, Salz, Edel- und Halbedelsteinen

Womit ich es jetzt mal probiert habe ist mit folgenden Parametern pdftotext eine Art Tabellenansicht zu generieren, damit ist es einigermaßen konsistent, zumindest bei den beiden PDFs die du bis jetzt gepostet hast, wie das bei anderen aussieht kann ich nicht vorhersehen...
strCMDLine = """" & ThisWorkbook.Path & "\pdftotext.exe"" -table -nopgbrk " 
Hiermit sieht das ganze dann so aus:

                                                                                                                  15868

Wirtschaftsdaten                           kompakt: Afghanistan

Stand: April 2013

Basisdaten

Fläche                                     652.230,0 qkm

Einwohner                                  2013: 30,6 Millionen *

Bevölkerungsdichte                         2013: 46,9* Einwohner/qkm

Bevölkerungswachstum                       2013: 2,2%

Geburtenrate                               2013: 39,0 Geburten/1.000 Einwohner

Fertilitätsrate                            2012: 5,1 Geburten pro Frau

Altersstruktur                             2014: 0-14 Jahre: 42%; 15-24 Jahre: 22,2%; 25-54 Jahre:

                                           29,4%; 55-64 Jahre: 2,5%; 65 Jahre und älter: 2,5%

Analphabetenquote                          2000: 71,9%

Rohstoffe          agrarisch               Opium, Weizen, Früchte, Nüsse, Wolle, Hammel, Schafsfell,

                                           Lammfell

                   mineralisch             Erdgas, Erdöl, Kohle, Kupfer, Chromit, Talk, Baryt, Schwefel,

                                           Blei, Zink, Eisenerz, Salz, Edel- und Halbedelsteinen

Mitglied in internationalen                SAARC, Colombo-Plan, UN ESCAP u.a.; zu bilateralen
Dann musst du aber auch für das Land den Regex anpassen.
Bei Regex kommt es auf jeden Buchstaben an, ob sichtbar oder nicht, deswegen passt dein Regex nicht weil ein Leerzeichen zwischen den einzelnen Rohstoffen auftritt und die Option [^\s]+ besagt: Matche alles was kein Whitspace-Character ist. Für den hinterern Submatch müsstest du den hier nehmen ([^\r\n]+ also alles was kein PageBreak ist. Du brauchst für den Regex zweitens einen Begrenzer für die Daten, weil du ja nicht weißt wie viele Klassen an Rohstoffe vorkommen. In diesem Fall wäre das der String Mitglied in internationalen der das ganze im Ganzen begrenzt. Und dann jeweils die Submatches sammeln. Da die Rohstoffe via Komma getrennt sind ließen sich diese mit der Split() Funktion voneinander trennen und in die jeweiligen Spalten überführen. Du siehst das ganze ist nicht so simpel wie du dir das vorstellst.

Ein Beispiel wie dies aussehen könnte(hier jetzt nur mit Ausgabe via MsgBox ohne Zuordnung zu dem Spalten, zum testen) (geht nur mit Abänderung der pdftotext-Zeile von oben:
regex.Global = True
regex.IgnoreCase = True
regex.Pattern = "(agrarisch|mineralisch)\s+([\s\S]+?,[\r\n]+[\s\S]+?)[\r\n]{4}|(agrarisch|mineralisch)\s+([\s\S]+?)[\r\n]{4}"  
Set matches = regex.Execute(strTXT)
If matches.count > 0 Then
	For Each match In matches
		' Rohstoffklasse  
		rohstoffklasse = match.Submatches(0)
		MsgBox "Klasse: " & rohstoffklasse  
		
		'ungewünschte Zeichen und Zeilenumbrüche entfernen  
		raw = Replace(Trim(match.Submatches(1)),"," & vbNewLine,",",1,-1,1)  
		raw = Replace(raw,vbNewLine,"")  
		
		'Stoffe in Array splitten  
		arrStoffe = Split(raw,",",-1,1)  
		For i = 0 To UBound(arrStoffe)
			stoff = Trim(arrStoffe(i))
			MsgBox stoff
		Next
	Next
End If
Eine Liste von verfügbaren Regex-Parametern kannst du in oben verlinkten Tutorial nachlesen, oder eine Referenzübersicht hier und hier

An deiner Stelle würde ich mich an die entsprechende Stelle wenden die die Daten veröffentlicht hat und dort eine Anfrage stellen ob die Daten zu Verfügung gestellt werden können. Das sind ja keine geheimen Daten sondern öffentlich verfügbare, vermutlich vom Bundesministerium für Wirtschaft und Energie zur Verfügung gestellt Das geht schneller und du sparst erheblich an Arbeitszeit (die sicherlich auch nicht umsonst ist). Hab das vor Jahren auch schon mal gemacht, die waren sehr umgänglich und haben mir entsprechende Daten gegen ein kleines Entgelt tabellarisch zur Verfügung gestellt.

Du kannst nämlich nicht sicher sein das alle PDFs alle exakt der selben Struktur folgen, da wird es sicherlich den ein oder anderen Ausreißer geben und du musst trotzdem wieder Hand anlegen. Und ich würde mich auf die Ausgabe von pdftotext nicht verlassen wenn später wichtige Berechnungen mit den Daten vorgenommen werden, und hinterher es dann doch nicht stimmt.

Alternativ die Daten in einem konsistenteren Zustand direkt auf den folgenden Seiten aus dem Web auslesen : http://www.laenderdaten.de/laender.aspx

Viel Erfolg
Grüße Uwe
xsto123
xsto123 01.06.2014 um 11:01:38 Uhr
Goto Top
Hallo Uwe,

vielen Dank noch mal.

1.) Ist aus dem Web auslesen denn einfacher? Die meisten Daten benötige ich sowieso aus dem CIA Factbook (https://www.cia.gov/library/publications/the-world-factbook/geos/br.html ..). Die von dir genannte Seite basiert zwar auf dem Factbook, hat aber, soweit ich das sehe, leider nicht alle Daten drin und auch nicht aktuell.

2.) Darf ich fragen, wie man sich die Daten per pdftotext.exe so darstellen lässt, wie du es gemacht hast? Du hattest weiter oben eine Möglichkeit beschrieben, aber wenn ich die per CMD in Windows anwende, wird bei mir eine TXT Datei erstellt, die nicht so geordnet ist wie deine. Außerdem sieht Afghanistan bei mir so aus:

15868
Wirtschaftsdaten kompakt: Afghanistan
Stand: April 2013
*) Schätzung bzw. Prognose
© Germany Trade & Invest 2014 - Gefördert durch das Bundesministerium für Wirtschaft und Energie aufgrund eines
Beschlusses des Deutschen Bundestages.
Basisdaten
Fläche 652.230,0 qkm
Einwohner 2013: 30,6 Millionen *
Bevölkerungsdichte 2013: 46,9* Einwohner/qkm
Bevölkerungswachstum 2013: 2,2%
Geburtenrate 2013: 39,0 Geburten/1.000 Einwohner
Fertilitätsrate 2012: 5,1 Geburten pro Frau
Altersstruktur 2014: 0-14 Jahre: 42%; 15-24 Jahre: 22,2%; 25-54 Jahre:
29,4%; 55-64 Jahre: 2,5%; 65 Jahre und älter: 2,5%
Analphabetenquote 2000: 71,9%
Rohstoffe agrarisch Opium, Weizen, Früchte, Nüsse, Wolle, Hammel, Schafsfell,
Lammfell
mineralisch Erdgas, Erdöl, Kohle, Kupfer, Chromit, Talk, Baryt, Schwefel,
Blei, Zink, Eisenerz, Salz, Edel- und Halbedelsteinen
Mitglied in internationalen
Wirtschaftszusammenschlüssen und
-abkommen
SAARC, Colombo-Plan, UN ESCAP u.a.; zu bilateralen
Abkommen siehe www.wto.org -> Trade Topics, Regional
Trade Agreements, RTA Database, By Country
Währung Bezeichnung Afghani (Af) ; 1 Af = 100 Puls
Kurs (März 2014) 1 Euro = 79,140 Af; 1 US$ = 57,710 Af
Jahresdurchschnitt 2013: 1 Euro = 73,703 Af; 1 US$ = 55,597 Af
2012: 1 Euro = 65,805 Af; 1 US$ = 51,065 Af
2011: 1 Euro = 65,521 Af; 1 US$ = 46,860 Af
Wirtschaftslage
Bruttoinlandsprodukt (BIP, nom.)
- Mrd. Af 2013: 1.148,1*; 2014: 1.248,7*; 2015: 1.378,5*
- Mrd. US$ 2013: 20,7*; 2014: 21,7*; 2015: 23,2*
BIP je Einwohner (nominal)
- Af 2013: 37.579*; 2014: 39.919*; 2015: 43.069*
- US$ 2013: 678,7*; 2014: 695,2*; 2015: 725,7*
BIP-Entstehung (%) 2012: Land-/Forst-/Fischwirtschaft 30,3;
Transport/Logistik/Kommunikation 20,3; Bergbau/Industrie
14,3; Handel/Gaststätten/Hotels 8,4; Bau 8,1; Anderes 18,5
BIP-Verwendung (%) 2012: Privatverbrauch 92,3; Staatsverbrauch 16,2;
Bruttoanlageinvestitionen 15,2; Außenbeitrag -27,3
*) Schätzung bzw. Prognose
© Germany Trade & Invest 2014 - Gefördert durch das Bundesministerium für Wirtschaft und Energie aufgrund eines
Beschlusses des Deutschen Bundestages.
Wirtschaftswachstum
Wirtschaftswachstum nach Sektoren
(%, real)
2012: Land-/Forst-/Fischwirtschaft 18,2; Bergbau/Herstellung
6,5; Handel/Gaststätten/Hotels 3,7; Bau 1,5;
Transport/Logistik/Kommunikation -0,8
Inflationsrate (%) 2013: 7,4; 2014: 6,1*; 2015: 5,5*
Arbeitslosenquote (%) 2004: 3,4
Haushaltssaldo (% des BIP) 2013: -0,6; 2014: -0,4*; 2015: -0,8*
Leistungsbilanzsaldo (% des BIP) 2013: 2,9*; 2014: 3,3*; 2015: -0,3*
Investitionen (netto, öffentlich und
privat, % des BIP)
2013: 18,0*; 2014: 17,2*; 2015: 18,5*
Jährliche Neuverschuldung (% des
BIP)
2013: 0,6; 2014: 0,4*; 2015: 0,8*
Ausländische Direktinvestitionen
- Transfer (Mio. US$) 2010: 211,3; 2011: 83,4; 2012: 93,8
- Bestand (Mio. US$) 2010: 1.391,6; 2011: 1.475,1; 2012: 1.568,9
Außenhandel
Außenhandel (Mrd. US$) 2010 % 2011 % 2012 %
Einfuhr 5,2 57,6 6,4 23,1 6,2 -3,1
Ausfuhr 0,4 0,0 0,4 0,0 0,4 0,0
Saldo -4,8 -6,0 -5,8
Außenhandelsquote (Ex- +
Importe/BIP in %)
2010: 36,6; 2011: 38,0; 2012: 32,5
Exportquote (Exporte/BIP in %) 2010: 2,6; 2011: 2,2; 2012: 2,0
Einfuhrgüter nach SITC (% der
Gesamteinfuhr)
2012: Nahrungsmittel 4,1; Nichtmetallische Mineralien 2,6;
Textilien/Bekleidung 2,1; Chem. Erzg. 0,8; Elektronik 0,2;
Sonstige 90,2
Ausfuhrgüter nach SITC (% der
Gesamtausfuhr)
2012: Textilien/Bekleidung 17,0; Nahrungsmittel 12,6;
Rohstoffe 5,0; Erdöl 0,0; Chemikalien 0,0; Sonstige 65,4
*) Schätzung bzw. Prognose
© Germany Trade & Invest 2014 - Gefördert durch das Bundesministerium für Wirtschaft und Energie aufgrund eines
Beschlusses des Deutschen Bundestages.
Wichtige Handelspartner
Beziehung der EU zu Afghanistan
Außenhandel (Mio. Euro) 2011 % 2012 % 2013 %
Einfuhr
der EU
47,6 15,5 56,5 18,7 55,6 -1,6
Ausfuhr
der EU
890,0 15,8 934,5 5,0 572,6 -38,7
Saldo 842,4 878,0 517,0
Beziehung Deutschlands zu Afghanistan
Außenhandel (Mio. Euro) 2011 % 2012 % 2013 %
dt. Einf. 10,9 -53,0 14,3 31,2 13,2 -7,7
dt. Ausf. 282,5 5,2 294,1 4,1 165,6 -43,7
Saldo 271,6 279,8 152,4
Deutsche Einfuhrgüter nach SITC (%
der Gesamteinfuhr)
2013: Nahrungsmittel 19,9; Rohstoffe 11,9; Nichtmetallische
Mineralien 9,7; Textilien/Bekleidung 7,2; Chem. Erzg. 6,1;
Sonstige 45,2
*) Schätzung bzw. Prognose
© Germany Trade & Invest 2014 - Gefördert durch das Bundesministerium für Wirtschaft und Energie aufgrund eines
Beschlusses des Deutschen Bundestages.
Deutsche Ausfuhrgüter
nach SITC (% der
Gesamtausfuhr)
Rangstelle bei deutschen Einfuhren 2013: 144 *
Rangstelle bei deutschen Ausfuhren 2013: 108 *
Deutsche Direktinvestitionen (Mio.
Euro)
- Nettotransfer
(Zunahme/Kapitalausfuhr: -)
2011: -1; 2012: -1; 2013: 0
Direktinvestitionen Afghanistans in
Deutschland (Mio. Euro)
- Nettotransfer 2011: 0; 2012: 0; 2013: 0
Investitionsschutzabkommen Abkommen vom 19./20.4.05, in Kraft seit 12.10.07
Bilaterale öffentliche
Entwicklungszusammenarbeit
- Finanzielle Zusammenarbeit 2012: 103 Mio. Euro
- Technische Zusammenarbeit 2012: 90 Mio. Euro
Botschaft der Bundesrepublik
Deutschland
Kabul, www.kabul.diplo.de
Botschaft Afghanistans in
Deutschland
Berlin, www.botschaft-afghanistan.de
Infrastruktur
Straßennetz (befestigt) 2006: 12.350 km
Festnetzanschlüsse 2012: 0 pro 1.000 Einwohner
Mobiltelefonanschlüsse 2012: 604 pro 1.000 Einwohner
Internetnutzer 2012: 54 pro 1.000 Einwohner
Personenkraftwagen 2011: 21 pro 1.000 Einwohner
Einschätzung des Geschäftsumfelds
Hermes Länderkategorie 7
Rangstelle:
Ease of Doing Business 2014 164 von 189 Ländern
*) Schätzung bzw. Prognose
© Germany Trade & Invest 2014 - Gefördert durch das Bundesministerium für Wirtschaft und Energie aufgrund eines
Beschlusses des Deutschen Bundestages.
Global Competitiveness Index 2013-
2014
nicht gelistet beim World Economic Forum
Corruption Perception Index 2013 175 von 177 Ländern
Länderbonität Institutional Investor März 2014: Rang 171; Bonitätsindex 11,8; 1-Jahres-
Veränderung 2,2
Quellen: Germany Trade & Invest bemüht sich, in allen Datenblättern einheitliche Quellen zu nutzen, so dass die Daten
für unterschiedliche Länder möglichst vergleichbar sind. Die kursiv gedruckten Daten stammen aus nationalen
Quellen oder sind für das jeweilige Land in unserer Standardquelle nicht verfügbar. Dies ist bei einem Vergleich dieser
Daten mit den Angaben in Datenblättern zu anderen Ländern zu berücksichtigen. Auf Anfrage nennen wir Ihnen gerne
die für den jeweiligen Indikator verwendete Quelle.
Ihr Ansprechpartner bei
Germany Trade & Invest
Ulrich Binkert
T. +49 (0) 228 24993-267
F. +49 (0) 228 24993-77-267
ulrich.binkert@gtai.de
Germany Trade & Invest ist die Gesellschaft zur Außenwirtschafts-
förderung der Bundesrepublik Deutschland. Die Gesellschaft berät
ausländische Unternehmen, die ihre Geschäftstätigkeit auf den deutschen
Markt ausdehnen wollen. Sie unterstützt deutsche Unternehmen, die
ausländische Märkte erschließen wollen, mit Außenwirtschaftsinfor-
mationen.
Germany Trade & Invest
Gesellschaft für Außenwirtschaft und
Standortmarketing mbH
Villemombler Straße 76 T. +49 (0) 228 24993-0
53123 Bonn F. +49 (0) 228 24993-212
Deutschland info@gtai.de
www.gtai.de

Das scheint weniger (?) verschoben wie bei dir zu sein, oder? Lässt sich damit eventuell eher etwas anfangen?

Beim GTAI habe ich bereits angefragt, leider wollen sie die Daten nicht als Excel zur Verfügung stellen. Daher muss ich irgendwie weiter versuchen, das Teil zum Laufen zu bringen face-smile

Vielen Dank und schönen Sonntag.
colinardo
colinardo 01.06.2014 aktualisiert um 11:35:54 Uhr
Goto Top
zu 1.) Ja es ist auf jeden Fall einfacher da die Daten dort schon in Tabellenform vorliegen, und du nicht auf die unvorhersehbare Umwandlung von pdftotext angewiesen bist.

zu 2.)
Die Parameter wie pdftotext aufgerufen wurde kannst du ja im Code nachvollziehen.

In meiner letzten Variante habe ich die Tabellenformatierung genommen:
pdftotext.exe -table -nopgbrk deinpdf.pdf"
Warum das Teil jetzt auf unterschiedlichen Systemen unterschiedliche Ergebnisse liefert kann ich im Moment nicht sagen, entweder du hast andere Parameter verwendet oder ??, da ist aber ein Auslesen aus dem Web wesentlich zuverlässiger. Ich mach die nächste Woche dazu mal ein Beispiel (sowas mach ich dann aber meistens entweder mit Powershell oder AutoIT)

Es wäre aber auch mal gut zu wissen welche Daten du brauchst und von welchen Ländern, sonst mach ich wieder das falsche Beispiel. Ich kann dir hier leider nicht mein ganzes Wissen dazu mitteilen, aber gegen ein entsprechendes Entgeld könnten wir darüber reden das ich dir die Daten als Excel aufbereite, meine Zeit ist ja auch nicht umsonst face-wink

Grüße Uwe
xsto123
xsto123 04.06.2014 um 19:39:35 Uhr
Goto Top
So, ich habe es jetzt endlich geschafft, im Büro nachzuschauen, welche Daten ich genau brauche. Zuerst einmal wollte ich nun doch die GTAI PDFs funktionstüchtig machen und mich danach erst um das CIA Factbook kümmern. Ich habe mir dazu alle PDFs die ich brauche gespeichert. Das Auslesen von Fläche und Einwohner funktioniert bei allen einwandfrei. Nun brauche ich noch folgende Felder:

Bruttoinlandsprodukt (BIP, nom.)
- Mrd. Euro 2012:2.666 2013:2.738 2014:2.835*

Wachstum der Industrieproduktion nach Sektoren (%, real)
2013: Kfz u. -teile 1,8; Maschinenbau -1,4; Nahrungsmittel 0,1; Elektronik -0,2; Elektrische Ausrüstungen -2,9; Metall-Erzeugnisse 1,4; chem. Erzeugnisse 0,6; Gummi- u. Kunststoffwaren 1,9

Inflationsrate (%) 2012: 2,1; 2013: 1,6; 2014: 1,7*

Arbeitslosenquote (%) 2012: 5,5; 2013: 5,4*; 2014: 5,3*

Staatsverschuldung (% des BIP, netto) 2012: 81,0; 2013: 78,4; 2014: 77,1*

Einfuhrgüter nach SITC (% der Gesamteinfuhr)
2013: Erdöl und Gas 13,9; Maschinen 11,9; Chem. Erzeugnisse 11,6 (dar. Arzneimittel 3,9); Elektrotechnik 9,8; Straßenfahrzeuge 7,9; Nahrungsmittel 6,1; Sonstige 38,8

Ausfuhrgüter nach SITC (% der Gesamtausfuhr)
2013: Maschinen 18,3; Straßenfahrzeuge 16,6; Chem. Erzeugnisse 14,7 (dar. Arzneimittel 5,2); Elektrotechnik 9,0; Metallwaren: 7,4; Nahrungsmittel: 4,7; Sonstige: 29,3

Meinst du, das bekommt man mit den Regex irgendwie hin? Ich habe einige TXT-Dateien kontrolliert und bei mir war eigentlich keine verschoben. Dafür funktioniert bei mir der -table Befehl überhaupt nicht.

Ich wäre dir unendlich dankbar, wenn du mir mit den Regex für diese Werte weiterhelfen könntest. Ich kann natürlich auch verstehen, wenn du das aufgrund der Zeit nicht kannst. Vielleicht würde es auch schon reichen, wenn du es mir noch mal an einem Beispiel erklären könntest. Ich kann leider nicht programmieren, daher fehlt mir wahrscheinlich das Grundverständnis für den Aufbau dieser Regex. face-sad
colinardo
Lösung colinardo 04.06.2014, aktualisiert am 05.06.2014 um 06:35:48 Uhr
Goto Top
Hi,
habe vorgestern das Factbook komplett mit allen Ländern in ein Excel Sheet eingelesen. Die einzelnen Kategorien befinden sich dabei jeweils in einer separaten Zelle, aber noch nicht von Zahlen und Einheiten getrennt - das ist quasi unmöglich da hier soviel unterschiedliche Varianten vorkommen. Aber mit ein wenig Nacharbeit in Excel mit zusätzlichen Spalten und Formel ist das für dich sicherlich kein Problem.

Schick mir deine E-Mail-Adresse via Personal Message dann lass ich dir das Sheet morgen zukommen face-smile Oder ich schick dir einen Downloadlink.

Grüße Uwe
xsto123
xsto123 06.06.2014 um 20:01:39 Uhr
Goto Top
Hallo Uwe,

ich wollte kurz Bescheid geben, dass ich fast alle Regex hinbekommen habe (danke für den Tipp mit RegexBuddy, hat die Arbeit wirklich sehr erleichtert). Das einzige, woran ich jetzt noch scheitere ist:

Einfuhrgüter nach SITC (% der Gesamteinfuhr)
2013: Erdöl und Gas 13,9; Maschinen 11,9; Chem. Erzeugnisse 11,6 (dar. Arzneimittel 3,9); Elektrotechnik 9,8; Straßenfahrzeuge 7,9; Nahrungsmittel 6,1; Sonstige 38,8

Könntest du mir eventuell noch ein (hoffentlich) letztes Mal weiterhelfen? Wäre wirklich der Hammer face-smile

Vielen Dank
colinardo
colinardo 06.06.2014 aktualisiert um 22:49:39 Uhr
Goto Top
Hi Daniel,
ich wollte kurz Bescheid geben, dass ich fast alle Regex hinbekommen habe
super, respekt face-smile Da gibt sich mal einer Mühe, das ist hier oft nicht selbstverständlich. Daumen hoch!

Also aus der Lameng, ohne groß zu Testen, da ich hier den Originaltext von pdftotext nicht da habe und nur mein Smartphone face-winksollte das in etwa so aussehen:
Ich habe es mit dem Drumherum geschrieben, da dies ja ein zweistufiger Prozess ist (erst mal die Zeile mit den Werten extrahieren und dann jeweils das Gut und die dazugehörige Prozentzahl). Das sind ja nicht immer gleich viele Güter in den PDFs ... deswegen dieser Weg!
regex.pattern = "^(Einfuhrgüter nach SITC)[\s\S]+?^(\d{4}):([\s\S]+?)^Ausfuhrgüter"  
regex.Ignorecase = True
regex.Multiline = True
set matches = regex.Execute(strTXT)
if matches.Count > 0 then
	category = matches(0).Submatches(0)
	jahr = matches(0).Submatches(1)
	msgbox category
	msgbox jahr
	result = Replace(Trim(matches(0).Submatches(2)),vbNewline,"")  
	regex.Global = True
	regex.pattern = "([^;]+?)([\d,]+)"  
	set smatches = regex.Execute(result)
	for each match in smatches
		gut = match.Submatches(0)
		prozent = match.Submatches(1)
		msgbox gut & ":" & prozent  
	Next
else
 	msgbox "No Match"  
End if
Schöne Pfingsten bei diesem Traumwetter
Grüße Uwe
xsto123
xsto123 07.06.2014 um 15:00:21 Uhr
Goto Top
Hallo Uwe,

auch das funktioniert wieder perfekt. Vielen Dank für die riesige Mühe, die du dir hier machst.
Es ist mir schon richtig peinlich zu fragen, aber nun werden die Daten ja per Msg Box ausgegeben. Bekomme ich die irgendwie noch in jeweils eine neue Zelle? Bestenfalls so (Beispiel):

Deutschland | 2011 | Erdöl | 20,5 | Eisen | 8,5 | usw.

Ich habe es schon selbst versucht, aber leider bekomme ich immer nur den letzten Wert in eine Zelle. Wahrscheinlich muss da irgendwie eine Schleife rein, damit er immer neue Spalten einfügt, solange es Daten gibt, oder? Leider übersteigt das meine Kenntnisse face-sad

Viele Grüße
colinardo
Lösung colinardo 07.06.2014 aktualisiert um 18:12:14 Uhr
Goto Top
ich weis jetzt zwar nicht in welcher Spalte du dich befindest, aber das legst du in Zeile 9 fest.
regex.pattern = "^(Einfuhrgüter nach SITC)[\s\S]+?^(\d{4}):([\s\S]+?)^Ausfuhrgüter"  
regex.Ignorecase = True
regex.Multiline = True
set matches = regex.Execute(strTXT)
if matches.Count > 0 then
	category = matches(0).Submatches(0)
	jahr = matches(0).Submatches(1)

        currentColumn = 10
        rnglastRow.Cells(1,currentColumn).Value = category
        rnglastRow.Cells(1,currentColumn + 1).Value = jahr

	result = Replace(Trim(matches(0).Submatches(2)),vbNewline,"")  
	regex.Global = True
	regex.pattern = "([^;]+?)([\d,]+)"  
	set smatches = regex.Execute(result)

        currentColumn = currentColumn + 2

	for each match in smatches
		gut = match.Submatches(0)
		prozent = match.Submatches(1)
                
	        rnglastRow.Cells(1,currentColumn).Value = gut
                rnglastRow.Cells(1,currentColumn + 1).Value = prozent
                currentColumn = currentColumn + 2
	Next
else
 	msgbox "No Match"  
End if
Grüße Uwe
xsto123
xsto123 07.06.2014 um 18:12:10 Uhr
Goto Top
Du bist ein Gott. :D
Habe mein Script vollendet und über alle Länder laufen lassen. Ich muss nur noch ganz wenige von Hand nacharbeiten (max. 15 Minuten Arbeit). Normalerweise wäre ich an der ganzen Liste bestimmt mehrere Wochen gesessen. So habe ich jetzt zwar auch einige Stunden in das Script und das Lernen der Regex investiert, aber das bringt mir zum einen persönlich auch etwas und zweitens kann man die Liste nun immer sehr schnell aktualisieren, wenn die PDFs erneuert werden.

Nun kann ich nächste Woche beruhigt ins Büro. Vielen Dank dir. Wünsche ein tolles sonniges WE.
Bis demnächst mal wieder ;)
cuwie.de
cuwie.de 18.03.2015 um 14:31:08 Uhr
Goto Top
Hallo zusammen,

ich muss das hier mal wieder ein bisschen aufwärmen, weil es mir auch sehr viel geholfen hat, Danke dafür schonmal vorweg.
In meinem Falle nutze ich das Script um PDF-Rechnungen auszulesen und in Excel zu erfassen. Dank der zusätzlichen Regex-Tipps und -Links bekomme ich so die Eckdaten (Rechnungsnummer, Datum, Gesamtbetrag etc.) wunderbar raus, aber wie schaffe ich es, die Detailangaben der Rechnungen auszulesen?
Meine Rechnungen sehen ungefähr so aus:

Kopfdaten
Kopfdaten
Kopfdaten
Kopfdaten
Kopfdaten
Kopfdaten
Kopfdaten

Allgemeine Informationen
Allgemeine Informationen
Allgemeine Informationen

Rechnungsdetails:
Bestellung 0815
Mitarbeiter 01 Tag 01 - Tag 03
Tag 01 5 STD 42,00 EUR 210,00 EUR
Tag 02 5 STD 42,00 EUR 210,00 EUR
Tag 03 5 STD 42,00 EUR 210,00 EUR

Mitarbeiter 02 Tag 01 - Tag 03
Tag 01 5 STD 42,00 EUR 210,00 EUR
Tag 02 5 STD 42,00 EUR 210,00 EUR
Tag 03 5 STD 42,00 EUR 210,00 EUR
Gesamt Bestellung 0815 1.260,00 EUR

Bestellung 0816
Mitarbeiter 01 Tag 01 - Tag 03
Tag 01 5 STD 42,00 EUR 210,00 EUR
Tag 02 5 STD 42,00 EUR 210,00 EUR
Tag 03 5 STD 42,00 EUR 210,00 EUR

Mitarbeiter 02 Tag 01 - Tag 03
Tag 01 5 STD 42,00 EUR 210,00 EUR
Tag 02 5 STD 42,00 EUR 210,00 EUR
Tag 03 5 STD 42,00 EUR 210,00 EUR
Gesamt Bestellung 0816 1.260,00 EUR
Gesamt 2.520,00 EUR
,
Fußzeile
Fußzeile
Fußzeile
Fußzeile
__________________________________________________________________________

Am liebsten wäre mir jetzt eine Liste, in der ich je gearbeitetem Tag eine Zeile bekomme, für die Auswertung brauche ich natürlich je Zeile auch allgemeine Angaben, aber wie gesagt, das klappt ja schon. Wie muss ich vorgehen, um die einzelnen Zeilen rauszuziehen? Mit Regex komme ich da ja nicht wirklich weiter...
Hat noch jemand hier einen Tipp für mich? Danke schonmal im Voraus!

Gruß,

Carsten
colinardo
colinardo 18.03.2015 aktualisiert um 14:34:23 Uhr
Goto Top
Hallo Carsten,
bitte mach dafür einen eigenen Thread auf, Danke. Den Usprungs-TO interessiert das sicher nicht !

Grüße Uwe
sporty1000
sporty1000 24.01.2021 um 12:00:29 Uhr
Goto Top
Moin, hammer, vielen Dank für den nützlichen Input!

Wenn jemand daran interessiert ist, mir mit Projekten dieser Art zu helfen (mit Scripts), bitte melden, habe da einige Aufträge und krieg es selbst nicht hin!
ShinySebs
ShinySebs 28.01.2022 um 11:40:50 Uhr
Goto Top
Moin Zusammen,
super Beitrag. Ist es möglich die gelesenen PDF-Dateien automatisiert in einen neuen Order zu legen (z.B. bearbeitete Rechnungen)

Grüße Sebastian