python3
文字列操作

【Python】文字列の分割用のライブラリ

作成目的

古い設計のソフトや、自分がJSONやXMLを知らなかった頃のソフトには、固定文字数で定義されたプレーンテキストのファイルやログが複数ある。これをその都度可視化するために展開するのは非常に厄介・・・
また、昔は根気よく文字数指定してFor文でぶん回して文字位置をカウントしていたのだが、Pythonでやろうとしたときにスライスで書くのがめんどくさくなってきた。
一応、古いファイルが見つかったときにこれをそのまま使いまわせないかと思ったので、めっちゃ長い文字数でも分割できるようにこのライブラリを作ることにした。

公開先

Github(まだうpってない)

実装

以下実装例と解説

初期化

import DecordStream
ds = DecordStream.DecordStream()

set(文字列) #文字列セット

この関数で文字列を渡します。また、カーソルを初期位置に戻します。

ds.set("Hello World!")

decord(文字数) #文字列取得

前回のカーソル位置から文字列を分割して取得します。
カーソル位置は終了位置まで移動します。

ds.set("Hello World!")

a = ds.decode(6)
b = ds.decode(6)
print(a + b)
#---- Console ----
#> Hello World!

文字列で戻ってくるので数値はキャストしてあげるといいでしょう。

ds.set("0123456789");
a = str(ds.decode(5))
b = int(ds.decode(5))
print(a)
print(b)
#---- Console ----
#> '01234'
#> 56789

以下のようにリストに入れてしまうことも可能。

ds.set("0123456789")
ary = []
ary.append(int(ds.decode(1))
#10回繰り返す
print(ary)
#---- Console ----
#> [0,1,2,3,4,5,6,7,8,9]

seek(文字数) #カーソル移動

カーソル位置は任意に移動することができます。
例えば文字列の中にある、余計な予約の空白など文字数だけスキップなど

ds.set("0123456789ABCDEF!");
ary = []
ary.append(ds.decode(4))
ds.seek(4)
ary.append(ds.decode(4))
ds.seek(4)
ary.append(ds.decode(1))
print(ary)
#---- Console ----
#> ['0123', '89AB', '!']

offset(カーソル位置) #カーソル位置セット

強制的にカーソルのカウント開始位置を設定します。
前回終了位置からではなく、0からスタートの絶対値です。

ds.set("0123456789ABCDEF!");
ary = []
ds.offset(10)
ary.append(ds.decode(2))
ary.append(ds.decode(2))
ary.append(ds.decode(2))
ary.append(ds.decode(1))
print(ary)
#---- Console ----
#> ['AB', 'CD', 'EF', '!']

alldecode(分割リスト) #一括で分割

文字数をセットされたリストを元に文字列を分割し、その分割結果をリストで返します。
一括で行うため、固定電文長の複数文字列を展開するのに便利です。

ds.set("HOGEhogeFUGAfuga!");
lists = [4,4,4,4,1]
ary = []
ary = ds.alldecode(lists)
print(ary)
#---- Console ----
#> ['HOGE', 'hoge', 'FUGA', 'fuga', '!']

コード

DecordStream.py
class DecordStream(object):
    def __init__(self, **kwargs):
        return super().__init__(**kwargs)

    def set(self, line):
        self.DecordLine = line
        self.position = 0
        return

    def decode(self, count):
        ret = self.DecordLine[self.position:self.position+count]
        self.position += count
        return ret

    def seek(self, count):
        self.position += count
        return

    def offset(self, offset):
        self.position = offset
        return

    def alldecode(self, lists):
        ret = []
        for size in lists:
            ret.append(self.DecordLine[self.position:self.position+size])
            self.position += size

        return ret