2017-12-20 3 views
0

私は何百万という行を持つ大きなjsonファイルを持っています。このファイルにもいくつかのエラーメッセージがあります。以下のサンプルである:予想されたようにパンダを使ってjson行を解析する

{"MEASUREMENT_1":"12345678","MEASUREMENT_2":"123456789012","MEASUREMENT_3":"MEASUREMENT_TYPE","MEASUREMENT_4":1111111111111,"MEASUREMENT_5":-1122,"MEASUREMENT_6":-2233,"MEASUREMENT_7":"123456789"} 
{"MEASUREMENT_1":"87654321","MEASUREMENT_2":"98","MEASUREMENT_3":"MEASUREMENT_TYPE_2","MEASUREMENT_4":222222222222,"MEASUREMENT_5":-4455,"MEASUREMENT_6":-6677,"MEASUREMENT_7":"123456789"} 
[2015-12-02 02:00:02,530] WARN Reconnect due to socket error: null 
[2015-12-02 02:00:02,633] WARN Reconnect due to socket error: null 

、以下のコードは、ファイルためのエラーメッセージ行のValueErrorをスロー。

#!/usr/bin/python3.5 
import pandas as pd # Version 0.21.0 
df = pd.read_json(file, lines=True) 

これは非常に大きなファイルであるため、私は以下のように、chunksizeとexpectionを使用しています

max_records = 1e5 
df = pd.read_json(file, lines=True, chunksize=max_records) 
filtered_data = pd.DataFrame() # Initialize the dataframe 
try: 
    for df_chunk in df: 
     filtered_data = pd.concat([filtered_data, df_chunk]) 
except ValueError: 
     print ('\nSome messages in the file cannot be parsed') 

しかし、上記の方法の欠点は、それが線の一部が欠けています。これを行うための良い方法はありますか?私はhttp://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_json.htmlのドキュメントを調べましたが、解析されていない行を無視できるものは見つかりませんでした。助けてもらえますか?

+0

これらの行を削除することは可能ですか? –

+0

それぞれの "測定"のように、独自のjsonオブジェクトがあるので、おそらくファイルにjsonオブジェクトがたくさんあり、失敗する可能性があります。 –

+0

forループの各繰り返し内のtryブロックではなく、tryブロック内にforループがあるのはなぜですか? – Acccumulation

答えて

0

最後に、ファイル内のエラーメッセージを取り除くソリューションを見つけました。ただし、この手順でファイルをクリーニングする時間が追加され、新しいファイルとして保存されます。

#!/usr/bin/python3.5 

    import re 
    import pandas as pd # Version 0.21.0 

    def clean_data(filename): 
     with open(filename, "r") as inputfile: 
      for row in inputfile: 
       if re.match("\[", row) is None: 
        yield row 

    with open(clean_file, 'w') as outputfile: 
     for row in clean_data(filename): 
      outputfile.write(row) 

    max_records = 1e5 
    df = pd.read_json(clean_file, lines=True, chunksize=max_records) 
関連する問題