0

私はPythonが初めてで、データをAPIに送信するために必要なものと一致するようにJSファイルの出力を変更するスクリプトを作成しようとしています。JS ファイルは urllib2 経由で読み込まれています。

def getPage():
    url = "http://url:port/min_day.js"
    req = urllib2.Request(url)
    response = urllib2.urlopen(req)
    return response.read()

# JS Data
# m[mi++]="19.12.12 09:30:00|1964;2121;3440;293;60"
# m[mi++]="19.12.12 09:25:00|1911;2060;3277;293;59"

# Required format for API
# addbatchstatus.jsp?data=20121219,09:25,3277.0,1911,-1,-1,59.0,293.0;20121219,09:30,3440.0,1964,-1,-1,60.0,293.0

内訳として(必須値は太字)

m[mi++]=" 19.12.12 09:30:00 | 1964 ;2121; 3440 ; 293 ; 60 "

-1、-1の値を文字列に追加する必要があります

日付を正しい形式に変換し、文字と改行を置き換えて出力をそのように見せることができましたが、この文字列値を並べ替える必要がある場合、間違った道を進んでいるような気がします. 時間的にも順番が逆に見えますが。

20121219,09:30:00,1964,2121,3440,293,60;20121219,09:25:00,1911,2060,3277,293,59

どんな助けでも大歓迎です!私は、正規表現に沿って、私が必要としているものかもしれないと考えています。

4

1 に答える 1

2

これは、不要なビットを取り除くための正規表現パターンです

m\[mi\+\+\]="(?P<day>\d{2})\.(?P<month>\d{2})\.(?P<year>\d{2}) (?P<time>[\d:]{8})\|(?P<v1>\d+);(?P<v2>\d+);(?P<v3>\d+);(?P<v4>\d+);(?P<v5>\d+).+

と置き換えます

20\P<year>\P<month>\P<day>,\P<time>,\P<v3>,\P<v1>,-1,-1,\P<v5>,\P<v4>

このパターンは、日付の前の文字が一定であることを前提としています。m\[mi\+\+\]="そのビットのより一般的な処理が必要な[^\d]+場合は、に置き換えることができます。

したがって、これをPythonで実践するには:

import re

def getPage():
    url = "http://url:port/min_day.js"
    req = urllib2.Request(url)
    response = urllib2.urlopen(req)
    return response.read()    

def repl(match):
    return '20%s%s%s,%s,%s,%s,-1,-1,%s,%s'%(match.group('year'),
                                            match.group('month'),
                                            match.group('day'),
                                            match.group('time'),
                                            match.group('v3'),
                                            match.group('v1'),
                                            match.group('v5'),
                                            match.group('v4'))

pattern = re.compile(r'm\[mi\+\+\]="(?P<day>\d{2})\.(?P<month>\d{2})\.(?P<year>\d{2}) (?P<time>[\d:]{8})\|(?P<v1>\d+);(?P<v2>\d+);(?P<v3>\d+);(?P<v4>\d+);(?P<v5>\d+).+')

data = [re.sub(pattern, repl, line).split(',') for line in getPage().split('\n')]

# If you want to sort your data
data = sorted(data, key=lambda x:x[0], reverse=True)

# If you want to write your data back to a formatted string
new_string = ';'.join(','.join(x) for x in data)

# If you want to write it back to file
with open('new/file.txt', 'w') as f:
    f.write(new_string)

それが役立つことを願っています!

于 2012-12-19T01:50:02.053 に答える