2013-08-19 7 views
7

Chciałbym przeprowadzić analizę niektórych nieruchomości wymienionych na nadchodzącej aukcji. Niestety, miasto, które prowadzi aukcję, nie publikuje informacji w ustrukturyzowanym formacie, ale zamiast tego podaje 700+ page PDF nieruchomości, które zostaną wystawione na aukcję.Poszukuję rekomendacji, jak konwertować PDF na format strukturalny.

Zastanawiam się, czy społeczność ma jakiekolwiek przemyślenia, w jaki sposób mogę podejść do przetwarzania wspomnianego pliku PDF w ustrukturyzowany format do wstawienia do bazy danych lub utworzenia arkusza kalkulacyjnego właściwości.

Oto obraz tego, co każda strona reprezentuje: Property Guide

A oto strona, która przedstawia niektóre właściwości: Sample List of Properties

jestem wygodne z Python i Ruby, więc nie mam żadnych problemów skryptowanie rozwiązania, ale ponieważ "kolumny" i dane w tych kolumnach nie są konieczne powiązane ze sobą, wydaje się, że byłoby to wątpliwe twierdzenie.

Wszelkie pomysły będą mile widziane.

+0

Moja myśl byłoby użyć pdf konwerter tekstowym, a następnie przetworzyć plik tekstowy (zakładając, że przetwornica daje przewidywalne format wyjściowy). –

+0

Tak, próbowałem. Jest to projekt rubinowy, który wypróbowałem (https://github.com/kitplummer/pdftohtmlr) i wypluł śmieci. – doremi

+0

Co zrobić z tekstem? Wygląda na to, że to HTML. –

Odpowiedz

1

Konwertuj na tekst za pomocą Xpdf za pomocą polecenia pdftotext.

I przekształcony plik z następujących czynności:

pdftottext.exe -layout -f 23 -l 510 AuctionBook2013.pdf AuctionBook2013.txt 

Konwersja ta pozostawia tekst dokładnie w oryginalnym układzie (z powodu -layout opcja). Opcje -f i -l wskazują pierwszą i ostatnią liczbę stron zakresu stron do wyodrębnienia.

Stamtąd parsowanie powinno być proste - liczba w kolumnie 8 oznacza pierwszą linię rekordu, pusta linia kończy rekord. Postępuj zgodnie z instrukcjami, aby dokładnie określić położenie elementów w rekordzie.

1

Po tym, jak zgniatałem z tym przez 3 godziny, udało mi się stworzyć z danych dokument XML z możliwością analizy składni. Niestety, nie udało mi się stworzyć kompletnego zestawu kroków, które można wykorzystać do przyszłych publikacji aukcji.

Odkładając na bok próbowałem zadzwonić do hrabstwa Los Angeles i zapytać, czy może podać alternatywny format nieruchomości na aukcję (program Excel itp.), A odpowiedź brzmi "nie". To rząd dla ciebie.

Oto widok wysokiego poziomu mojego podejścia:

  • Konwersja PDF do pliku tekstowego za pomocą Poppler
  • użyć wyrażenia regularnego foo oczyścić i tworzenie węzłów XML z danymi
  • Użyj narzędzia upiększania/walidatora XML, aby znaleźć błędy i oczyść je.
  • Użyj Pythona/ruby, aby dodać węzeł Google Maps Link, i umieść link do mapy oceniającej LA County (http://assessormap.co.la.ca.us/mapping/rolldata.asp?ain=APN-GOES_HERE) i
  • Konwersja XML do pliku CSV z Ruby

użyłem http://xmlbeautifier.com/ jak mój XML Beautifier/walidator ponieważ była szybka i dał dokładne raportowanie błędów, łącznie z numerami linii.

Zastosowanie Homebrew zainstalować Poppler dla Mac:

brew install poppler 

Po zainstalowaniu Poppler, trzeba mieć dostęp do narzędzia pdftotext do konwersji PDF:

pdftotext -layout -f 24 -l 687 AuctionBook2013.pdf auction_book.txt 

Oto podgląd XML (Click here for full XML):

<?xml version="1.0" encoding="UTF-8"?> 
<listings> 
    <item id="1"> 
     <nsb>536</nsb> 
     <minbid>3,422</minbid> 
     <apn>2006 003 001</apn> 
     <delinquent_year>03</delinquent_year> 
     <apn_old>2006 003 001</apn_old> 
     <description>LICENSED SURVEYOR'S MAP 
      AS PER BK 25 PG 28 OF L S LOT 1    
      BLK 1 ASSESSED TO J AND S 
      LIMITED LLC C/O DUNA CSARDAS - 
      JULIUS JANCSO LOCATION COUNTY OF 
      LOS ANGELES</description> 
     <address>VACANT LOT</address> 
    </item> 

Edytuj: Dodanie ruby, którą napisałem, aby przekonwertować XML na CSV.

require 'rexml/document' 
require 'CSV' 

class Auction 

    def initialize 

    f = File.new('AuctionBook2013.xml', 'r') 
    doc = REXML::Document.new(f) 

    CSV.open("auction.csv", "w+b") do |csv| 
     csv << ['id', 'minbid', 'apn', 'delinquent_year', 'apn_old', 'description', 'address'] 

     doc.elements.each('/listings/item') do |item| 
     csv << [item.attributes['id'], 
       item.elements['minbid'].text, 
       item.elements['apn'].text, 
       item.elements['delinquent_year'].text, 
       item.elements['apn_old'].text, 
       item.elements['description'].text, 
       item.elements['address'].text] 
     end 
    end 
    end 
end 

a = Auction.new() 

Link to Final CSV

Powiązane problemy