2016-12-16 6 views
0

古いデータベースに正しく保存されていないデータがあります。私はシステムを新しいデータベースに移して、古いデータを再フォーマットしています。古いデータは次のようになります。私は取り除くために正規表現を使用して考えていますRegexが不適切なJSONデータを再フォーマットする

data = { 
    "step_no": "1", 
    "YOUR_NAME":"Firtname Lastname", 
    "CITIZENSHIP":"Indian", 
    "PROPOSE_NAME_BUSINESS1":"ABC Limited", 
    "PROPOSE_NAME_BUSINESS2":"XYZ Investment", 
    "PROPOSE_NAME_BUSINESS3":"", 
    "PROPOSE_NAME_BUSINESS4":"", 
    "PURPOSE_NATURE_BUSINESS":"Some dummy content", 
    "CAPITAL_COMPANY":"20 Million Capital", 
    "ANOTHER_AMOUNT":"" 
} 

a:10:{ 
    s:7:"step_no";s:1:"1"; 
    s:9:"YOUR_NAME";s:14:"Firtname Lastname"; 
    s:11:"CITIZENSHIP"; s:7:"Indian"; 
    s:22:"PROPOSE_NAME_BUSINESS1"; s:12:"ABC Limited"; 
    s:22:"PROPOSE_NAME_BUSINESS2"; s:15:"XYZ Investment"; 
    s:22:"PROPOSE_NAME_BUSINESS3";s:0:""; 
    s:22:"PROPOSE_NAME_BUSINESS4";s:0:""; 
    s:23:"PURPOSE_NATURE_BUSINESS";s:15:"Some dummy content"; 
    s:15:"CAPITAL_COMPANY";s:24:"20 Million Capital"; 
    s:14:"ANOTHER_AMOUNT";s:0:""; 
} 

私はPythonで読むことができるように、適切なJSON形式にするための新しい外観は次のように突出したいです不要な部分や名前を使ってコンテンツを再フォーマットするのはうまくいくだろうが、これについてどうやって行くのか分からない。

答えて

2

正規表現はここでは間違ったアプローチです。必要はなく、フォーマットはあなたが想定しているより少し複雑です。

あなたはPHP serialize formatのデータを持っています。あなたは自明phpserialize libraryとPythonでそれをdeserialiseすることができます:PHPの文字列がバイト文字列であることを

import phpserialize 
import json 

def fixup_php_arrays(o): 
    if isinstance(o, dict): 
     if isinstance(next(iter(o), None), int): 
      # PHP has no lists, only mappings; produce a list for 
      # a dictionary with integer keys to 'repair' 
      return [fixup_php_arrays(o[i]) for i in range(len(o))] 
     return {k: fixup_php_arrays(v) for k, v in o.items()} 
    return o 

json.dumps(fixup_php(phpserialize.loads(yourdata, decode_strings=True))) 

注意、あなたが後にキーと値のペアをデコードする必要があると思いますので、特にPythonの3でないUnicodeのテキストを、 JSONに再エンコードできるようにしたい場合は、事実です。 decode_strings=Trueフラグがこれを処理します。デフォルトはUTF-8で、encoding引数を渡して別のコーデックを選択します。

PHPはまた、配列については配列を使用していますので、あなたはかもしれは、任意のfixup_php_arrays()機能が何をするかである、最初のリストに整数キーとdictオブジェクトをデコード変換する必要があります。

デモ(修復データを、多くの文字列の長さはオフであり、空白を加えた):

>>> import phpserialize, json 
>>> from pprint import pprint 
>>> data = b'a:10:{s:7:"step_no";s:1:"1";s:9:"YOUR_NAME";s:18:"Firstname Lastname";s:11:"CITIZENSHIP";s:6:"Indian";s:22:"PROPOSE_NAME_BUSINESS1";s:11:"ABC Limited";s:22:"PROPOSE_NAME_BUSINESS2";s:14:"XYZ Investment";s:22:"PROPOSE_NAME_BUSINESS3";s:0:"";s:22:"PROPOSE_NAME_BUSINESS4";s:0:"";s:23:"PURPOSE_NATURE_BUSINESS";s:18:"Some dummy content";s:15:"CAPITAL_COMPANY";s:18:"20 Million Capital";s:14:"ANOTHER_AMOUNT";s:0:"";}' 
>>> pprint(phpserialize.loads(data, decode_strings=True)) 
{'ANOTHER_AMOUNT': '', 
'CAPITAL_COMPANY': '20 Million Capital', 
'CITIZENSHIP': 'Indian', 
'PROPOSE_NAME_BUSINESS1': 'ABC Limited', 
'PROPOSE_NAME_BUSINESS2': 'XYZ Investment', 
'PROPOSE_NAME_BUSINESS3': '', 
'PROPOSE_NAME_BUSINESS4': '', 
'PURPOSE_NATURE_BUSINESS': 'Some dummy content', 
'YOUR_NAME': 'Firstname Lastname', 
'step_no': '1'} 
>>> print(json.dumps(phpserialize.loads(data, decode_strings=True), sort_keys=True, indent=4)) 
{ 
    "ANOTHER_AMOUNT": "", 
    "CAPITAL_COMPANY": "20 Million Capital", 
    "CITIZENSHIP": "Indian", 
    "PROPOSE_NAME_BUSINESS1": "ABC Limited", 
    "PROPOSE_NAME_BUSINESS2": "XYZ Investment", 
    "PROPOSE_NAME_BUSINESS3": "", 
    "PROPOSE_NAME_BUSINESS4": "", 
    "PURPOSE_NATURE_BUSINESS": "Some dummy content", 
    "YOUR_NAME": "Firstname Lastname", 
    "step_no": "1" 
} 
関連する問題