2017-09-27 13 views
0

Scopusから入手した科学論文に関する多くの情報を含む20GBのデータベースファイル(* .db)があります。ほとんどの情報は、データベースファイル内の応答テーブルに格納されます。私は各出版された記事から主題分野を取得したい。私はデータベースファイルからこれを取得する方法がわかりません。PythonでSQLテーブルから情報を取得

データベースファイルの各行には、著者、記事、およびサブジェクトエリアに多くの情報が格納されています。スニペットは次のようになります。この大規模な(しかし、実際にも、はるかに大きい)テーブルから

{"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"}]}} 

、私はdc-identifierと(複数の)サブジェクト・エリアを得ることにだけ興味を持っています。理想的には、私はそれらを* .csvファイルに入れます。

Pythonを使用して* .dbファイルからこの情報を取得する簡単な方法はありますか? sqlite3のを使用して、私は次のコードを使用してデータベースへのアクセスもを得ることができるように見える:

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

私にとって、私が今だけのデータベースからのDC-IDとサブジェクト・エリア情報を取得する方法は明らかではありませんファイル。

+2

データはJSONと思われるので、データベースからデータを読み込んだら(例: 'c.execute(" select * from responses; "))、結果を繰り返し、Pythonの' json'ライブラリを使ってそれぞれを読み込みますあなたが望む情報を抽出することができるPythonのデータ構造に行を並べ替えることができます。それで、解析や書き出しに必要な他のフォーマットに格納することができます。 –

+0

ありがとう!私はまだPython(とjson)だから、私はファイル全体をどのように反復することができないのでしょうか?jsonを使用して各行をデータ構造にロードするにはどうすればよいですか? –

+1

以下を参照してください –

答えて

1

json.loads()関数を使用すると、入力JSON文字列を、辞書とリストの階層セットで構成されるPythonオブジェクトに変換します。標準のPython演算子を使用してその情報を抽出する必要があります。以下は例ですが、この例では正しいドキュメントIDを取得するかどうかはわかりません。これもテストされていないので、修正または修正が必要な場合があります。また、入力例にアンバランスな中カッコがあるため、以下で使用する構造の解釈が正しくない可能性があります。このコードの終わりに

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]) 

subjectlistは、後者の各々は、文書IDと対象領域からなる、2要素リストのリストであろう。その後、csvライブラリを使用してエクスポートしたり、新しいテーブルとしてデータベースにプッシュバックして、より簡単にクエリを実行したりすることができます。

+0

これは本当に、問題は、関連する情報が 'row [6] 'にあるように見えるので、コマンドは' json.loads(row [6]) '。私は得る最初の作者IDですが、スクリプトは機能しなくなります。あなたは大きな助けを受けていますので、助けを止めても構いません。思った以上に複雑です。 –

+1

SELECT文を修正して、 '*'の代わりに必要なカラム(つまり、7番目のカラム)を得ることができます。これは少し速くてメモリを少し使います。 'for row in c:'の代わりに、 'rows = curs.fetchall()'の後に 'for row in row:'を実行すると、返されたデータを検査することができます。また、 'json.loads()'コマンドでエンコーディングを指定する必要があるかもしれません。 –

関連する問題