2017-09-27 4 views
0

Ich habe eine 20-GB-Datenbankdatei (* .db), die viele Informationen zu wissenschaftlichen Artikeln enthält, die von Scopus übernommen wurden. Die meisten Informationen werden in der Antworttabelle in der Datenbankdatei gespeichert. Ich möchte nur die Themenbereiche von jedem veröffentlichten Artikel erhalten. Ich habe keine Ahnung, wie man das aus der Datenbankdatei holt.Abrufen von Informationen aus der SQL-Tabelle mit Python

In jeder Zeile in der Datenbankdatei sind viele Informationen zum Autor, zum Artikel und auch zum Themenbereich gespeichert. Ein Ausschnitt sieht wie folgt aus:

{"abstracts-retrieval-response":{"coredata":{"prism:url":"http://api.elsevier.com/content/abstract/scopus_id/85012897283","dc:identifier":"SCOPUS_ID:85012897283","eid":"2-s2.0-85012897283","language":{"@xml:lang": "eng"},"authkeywords":{"author-keyword": [{"@_fa": "true", "$" :"austerity policies"},{"@_fa": "true", "$" :"housing policy"},{"@_fa": "true", "$" :"Italy"},{"@_fa": "true", "$" :"Mediterranean welfare regime"},{"@_fa": "true", "$" :"Neoliberalism"},{"@_fa": "true", "$" :"Spain"}]},"idxterms":null,"subject-areas":{"subject-area": [{"@_fa": "true", "@abbrev": "SOCI", "@code": "3303", "$" :"Development"},{"@_fa": "true", "@abbrev": "SOCI", "@code": "3322", "$" :"Urban Studies"},{"@_fa": "true", "@abbrev": "ENVI", "@code": "2308", "$" :"Management, Monitoring, Policy and Law"}]}} 

Von diesem großen (aber in Wirklichkeit noch viel größer) Tisch, ich bin nur daran interessiert, die dc-identifier bekommen und die (mehrfach) Fachbereiche. Im Idealfall würde ich sie in einer * .csv-Datei bekommen.

Gibt es eine einfache Möglichkeit, diese Informationen aus der * .db-Datei mit Python zu erhalten? Mit sqlite3 Ich scheine in der Lage sein Zugang zur Datenbank zu erhalten mit dem folgenden Code:

import sqlite3 
conn = sqlite3.connect('C:/responses.db')  
c = conn.cursor() 

Für mich ist es nicht klar ist, wie kann ich jetzt nur die Informationen, dc-Kennung und Fachbereiche erhalten aus der Datenbank Datei.

+2

Die Daten scheinen JSON zu sein, also nach dem Lesen der Daten aus der Datenbank (zB 'c.execute (" select * from responses; ") durch die Ergebnisse gehen und die' json'-Bibliothek von Python zum Laden verwenden reihe in eine Python-Datenstruktur, aus der du die gewünschten Informationen extrahierst, die du dann in einem anderen Format für Analyse oder Export speichern kannst .. –

+0

Vielen Dank Ich bin noch ein Anfänger mit Python (und Json) Jetzt bin ich fest, wie ich durch die ganze Datei iterieren könnte. Wie lade ich jede Zeile in eine Datenstruktur mit JSON? Alle Vorschläge oder Ideen wären sehr hilfreich. –

+1

Siehe Antwort unten hinzugefügt. –

Antwort

1

Mithilfe der Funktion json.loads() wird die Eingabe-JSON-Zeichenfolge in ein Python-Objekt konvertiert, das aus einem hierarchischen Satz von Wörterbüchern und Listen besteht. Sie müssen dann die Informationen daraus mithilfe von Standard-Python-Operatoren extrahieren. Es folgt ein Beispiel, obwohl ich nicht sicher bin, ob das Beispiel die richtige Dokument-ID enthält. Dies ist auch nicht getestet, so dass Sie möglicherweise zwicken oder korrigieren müssen. Außerdem hat Ihre Beispieleingabe asymmetrische geschweifte Klammern, so dass die Interpretation der Struktur, die unten verwendet wird, möglicherweise nicht ganz richtig ist.

import sqlite3 
import json 

conn = sqlite3.connect('C:/responses.db')  
c = conn.cursor() 

# Initialize the output list. 
subjectlist = [] 

# Get the data from SQLite. 
c.execute("select * from responses;") 

# Iterate over all the rows of data 
for row in c: 
    # Extract and save the subject information. 
    article = json.loads(row[0]) 
    doc_id = article["abstracts-retrieval-response"]["coredata"]["dc:identifier"] 
    subjects = [s["$"] for s in article["abstracts-retrieval-response"]["coredata"]["subject-areas"]["subject-area"]] 
    for s in subjects: 
     subjectlist.append([doc_id, s]) 

Am Ende dieses Codes, subjectlist wird eine Liste von Zweielementlisten, wobei jede der letzteren sein, die aus dem Dokument-ID und einem Fachgebiet. Sie können dann die Bibliothek csv verwenden, um diese zu exportieren oder sie als neue Tabelle in die Datenbank zu verschieben, um die weitere Abfrage zu erleichtern.

+0

Das ist wirklich, wirklich toll - vielen Dank, ich bin jetzt fast da, das Problem ist, dass die relevante Information in Zeile 6 zu stehen scheint, so dass der Befehl 'json.loads (Zeile [6]) verwenden sollte. 'Ich verstehe die erste Autoren-ID, aber dann funktioniert das Skript nicht mehr. Du warst eine große Hilfe, also zögere nicht aufzuhören zu helfen, es ist einfach viel komplexer als ich dachte. –

+1

Sie könnten die SELECT-Anweisung ändern, um nur die Spalte zu erhalten, die Sie benötigen (d. H. Die 7. Stelle) statt "*", was ein wenig schneller sein kann und etwas weniger Speicher benötigt. Anstelle von 'für row in c:' könnten Sie 'rows = curs.fetchall()' gefolgt von 'für row in rows:' verwenden - dies würde Ihnen erlauben, die zurückgegebenen Daten zu überprüfen. Möglicherweise müssen Sie auch eine Codierung mit dem Befehl 'json.loads()' angeben. –

Verwandte Themen