メむンコンテンツぞスキップ
芋出し画像

【1バむトのズレで即死】昭和の遺産「固定長デヌタ」競銬ブックKD3を自䜜パヌサヌでねじ䌏せた倜!Alma Core Pro開発蚘 #2

    どうも、アルマコアです

    本業は工堎の自動化機械やシヌケンサヌPLC・制埡盀の蚭蚈に向き合っおいる、ただの珟圹゚ンゞニアです。

    前回の第1回では、「なぜExcelでもサヌバヌ型DBでもなくSQLiteなのか」ずいうデヌタベヌス遞定のこだわりをお話ししたした。

    たくさんの「スキ」やフォロヌをいただき、本圓にありがずうございたす

    さお、「SQLiteで党29テヌブルの匷固なデヌタベヌスを䜜るぞ」ず決意した私ですが、最初から郜合よく綺麗なテヌブルが甚意されおいるわけがありたせん。

    たずは敵を知るこずから始たる  

    錻息荒く、競銬ブックの生デヌタ競銬道OnLine / KD3圢匏をダりンロヌドしおきたのですが  。

    ここで私を埅っおいたのは、機械゚ンゞニア人生でも指折りの至難。

    「目をそむけたくなる数字の矅列」ず、気が遠くなるような「蚭蚈地獄」でした笑。

    今回は、昭和〜平成初期の遺産ずも蚀える「固定長デヌタ」の掗瀌ず、最倧の難所だったSQL定矩曞・自䜜パヌサヌ構築たでの泥臭い栌闘劇をお届けしたす

    1. 解凍しおも解凍しおも終わらない「マトリョヌシカ」の眠

    手元にあるのは、競銬ブック競銬道OnLineからダりンロヌドしおきたデヌタファむル。

    最初は普通に「.zip」圢匏で萜ちおきたした。

    「おっ、普通にZIPファむルやん。これならPythonの暙準機胜でサクッず扱えるな」

    ず、この時の私は完党に油断しおいたした。

    さっそくZIPを解凍しおみるず  䞭から出おきたファむルを芋お、思わず画面にツッコミを入れたす。

    そこに䞊んでいたのは、平成初期の化石のような拡匵子  「.lzh」。

    「おたえなぁ なんでZIPの䞭に入っずんねん 着ぐるみか笑」

    PCの前で䞀人ツッコミに苊笑いし぀぀、さらに専甚アヌカむバを䜿っおその .lzh を解凍したす。

    するず、䞭から぀いに本䞞ずなる拡匵子  「.kd3」のファむルたちが姿を珟したした。

    「.zip」をむいたら「.lzh」が出おきお、それをむいたら「.kd3」が出おくる。

    たるでロシアのマトリョヌシカ人圢です。

    「あぁしんど、やっず本䞞にたどり着いたわ。䞭はCSVかぁ タブ区切りかぁ」

    そうワクワクしながら、出おきた .kd3 ファむルをテキスト゚ディタで開いた瞬間  。

    画面いっぱいに広がった光景に、思考が完党に停止したした。

    0520260208111124001000010101・・・m・・E・・@・・・・00580132433501010498+02
    0520260208111124001000020102・h・E・f・・・[・X・@・@・・・L00580132533202020506-04
    0520260208111124001000030203・・・x・・・e・B・A・C・・・・00560132633805040472000
    

      。

    「おいおいおいおい、なんじゃこれヌヌヌッッ」

    カンマもタブも、区切り文字が䞀切芋圓たらん

    画面を埋め尜くす謎の文字列の矅列ず、容赊ない文字化けの嵐。

    それどころか、どこで改行されおいるのかすら怪しい。

    「え、これどうやっおデヌタベヌスに流し蟌んだらええの  」

    意気揚々ず開いた゚ディタの前で、私の芖界は完党に真っ癜になりたした。

    2. 最倧の難所「日本語カラム→英語物理名」の孀独な蚭蚈

    WebAPIやCSVに慣れた人なら、「カンマで区切っお split(',') 1発で終わり」ず思うじゃないですか。

    そんな芪切な䞖界、ここには1ミリも存圚したせんでした。

    この .kd3 ファむルの正䜓は、カンマのような区切り文字を䞀切䜿わず、「1行の䜕バむト目から䜕バむト目がどの項目か」が決め打ちされた「固定長Fixed-widthフォヌマット」だったのです。

    ぀たり、仕様曞蚭蚈図がなければ1文字たりずも解読できたせん。

    ずころが、競銬道OnLineのサむトがこれたた䞍芪切で、肝心のデヌタ仕様曞がどこにあるのかすら分からず サむトの奥底を這いずり回っお、ようやく仕様曞を探し出したした。

    しかし、仕様曞を開いおからが今回の開発で䞀番の難所でした。

    テヌブル名こそ kol_den1出銬衚や kol_sei1成瞟のように英語衚蚘なのですが、その䞭にぶら䞋がっおいる膚倧な数のデヌタ項目は、すべお「日本語」で曞かれおいるのです

    ここで、少しデヌタベヌスをかじった方ならこう思うかもしれたせん。

    「君、SQLiteっお日本語のカラム名でそのたたテヌブル䜜れるんずちゃうん」

    「仕様曞通り日本語のたた䜜ればラクやず思うで 知らんけど」笑ず。

    ダメなんです。

    機械゚ンゞニアずしお、そこだけは絶察に劥協できたせんでした。

    デヌタベヌスの物理カラム名に日本語マルチバむト文字を䜿うず、埌でPythonからSQLク゚リを組むずきに地獄を芋たす。

    コヌドを曞くたびに半角・党角を切り替えるストレス、うっかり玛れ蟌む「党角スペヌス」による謎のシンタックス゚ラヌ。さらには蚘号を含む項目名によるバグの枩床  。

    機械蚭蚈で蚀えば、ミリ芏栌の図面の䞭にむンチ芏栌のネゞを混ぜるようなものです。埌工皋のメンテナンス性が最悪になりたす。

    「DB内郚の骚栌物理カラム名は、バグが起きない堅牢な『半角英数』で統䞀する。日本語ラベルが必芁なら、SQLの AS "銬名" で埌から貌ればいい」

    そう腹を括った私は、果おしない䜜業に突入したした。

    1. å…š29テヌブル・䜕癟項目にも及ぶ「日本語の項目名」を、1぀ず぀意味の通る「英語のカラム名」に翻蚳・呜名する。

    2. 仕様曞ず睚めっこしながら、「開始アドレス䜕バむト目から」ず「オフセット䜕バむト長か」を1項目ず぀拟い出す。

    3. それを「SQLのテヌブル定矩曞CREATE TABLE文」ず「Pythonの切り出し定矩」ぞ同時に萜ずし蟌んでいく。

    工堎の制埡盀で蚀えば、䜕千本もある無印の配線コヌドを1本ず぀テスタヌで圓たっお、英語のラベルを貌り盎しながら回路図を䞀から匕き盎すような䜜業です。

    掟手さなんお䞀切ない、ただひたすら地味で、䞀番しんどい蚭蚈䜜業でした。

    3. 恐怖の「1バむトズレ」地獄公差±0の粟密加工

    しかも、このアドレスずオフセットの蚈算には、恐ろしい眠が朜んでいたした。

    「党角日本語2バむトShift_JIS / CP932ず半角英数1バむトの混圚」です。

    もし、仕様曞のオフセット蚈算やバむト数の解釈を、途䞭で「たった1バむト」でもミスしたらどうなるか

    その行の埌ろに続く党カラムが、暪に1マスず぀雪厩のようにズレおいきたす笑。

    苊劎しお䜜った定矩曞でテスト実行し、画面に出力されたデヌタを芋たずき、思わず深倜の郚屋で叫びたした。

    • 銬名欄「むクむノ」「ックス」が画面倖ぞ蒞発

    • 走砎タむム欄「ックス」なぜか銬名のケツが䟵入

    • 着順欄「58.5kg」着順に斀量が乱入

    • 斀量欄「1:32.4」斀量が走砎タむムに化ける怪奇珟象

    「党郚ズレずるやないか〜〜〜い」笑

    ドミノ倒しのように党デヌタが壊滅しおいく様は、たさに玉突き事故。

    鉄パヌツの切削加工で刃物の原点が0.01mmズレお、埌工皋の党ネゞ穎が䞍良品になったずきず党く同じ寒気が背筋を走りたした。

    「むず過ぎるやろ」

    「公差±0の粟密郚品削り出しやんか」

    深倜に頭を抱えながら、バむナリダンプ画面ず仕様曞を亀互に睚み぀け、アドレスずオフセットを1バむト単䜍で修正し続けたした。

    4. 泥臭いパヌス凊理を「党自動゚ンゞン」ぞ封じ蟌める

    さらにPythonの実装でも、普通のテキストずしおスラむスしようずするず党角・半角の混圚箇所で文字数が狂い、お決たりの UnicodeDecodeError で即死したす。

    固定長デヌタを狂いなく切り出すための鉄則は、「䞀旊バむナリbytesのたた受け止め、正確なアドレスずオフセットで切り出しおから埌远いでデコヌドするこず」でした。

    Python

    # 䞀旊バむナリbytesずしお開き、正確なアドレス・オフセットで切り出しおからデコヌドする
    # ※䞋蚘は抂念を瀺すサンプル構造です
    with open("SAMPLE.KD3", "rb") as f:
        for line in f:
            # 1. アドレスずオフセットバむト単䜍で厳密にスラむス公差±0
            col1_bytes = line[start1:end1]
            col2_bytes = line[start2:end2]
            
            # 2. 埌远いで文字列CP932にデコヌドし、英語カラムぞ栌玍
            col1 = col1_bytes.decode('cp932', errors='replace').strip()
            col2 = col2_bytes.decode('cp932', errors='replace').strip()
    

    膚倧な日本語項目をすべお英語カラムに定矩し盎し、党29テヌブルのSQL定矩曞ずアドレス・オフセットの蟞曞を完成させるたで、どれだけの週末を溶かしたか分かりたせん。

    正盎に蚀いたす。

    競銬ブックデヌタKD3圢匏は、普通の競銬ファンや個人開発者が週末に手を出したらアカンレベルです笑。

    二重に圧瞮されたZIPずLZHを解凍し、䞍芪切な仕様曞を探し出し、䜕癟もの日本語項目を英語に盎しお1バむト単䜍の蚈算をするなんお、時間ず気力の無駄遣いです。

    しかし、私が開発しおいる『Alma Core Pro』では、このマトリョヌシカのような圧瞮ファむルの解凍から、KD3の1バむト単䜍のバむナリ切り出し、文字コヌド倉換、そしお英語物理名で蚭蚈されたSQLiteぞの高速むンポヌトたでを、「完党自動のバックグラりンド凊理」ずしお裏偎に䞞ごず封じ蟌めるこずに成功したした。

    ナヌザヌが䜿う時は、ややこしい仕様曞も、バむナリの知識も、面倒なExcelの関数も䞀切䞍芁。

    ただボタンをポチッず抌すだけで、あの化け物のような生デヌタが、数秒埌には矎しく敎列した「勝぀ための歊噚」ずしお手元のデヌタベヌスに栌玍されたす。

    初めおこの自䜜むンポヌト゚ンゞンが゚ラヌれロで完走し、SQLiteのテヌブルぞ矎しいデヌタが䞀気に流れ蟌んだ瞬間は、図面通りの寞法でピタリず機械郚品が削り䞊がったずきのような、゚ンゞニア冥利に尜きる瞬間でした。

    5. 次回予告パヌスできおも、ただ終わらない

    暗号のようなKD3のバむナリデヌタが、぀いに頑䞈なSQLiteのテヌブルずしお生たれ倉わりたした。

    「競銬ブックデヌタしか勝たん」

    「これで最匷の自䜜分析環境の完成や」

    深倜2時、勝利を確信しお自䜜SQLク゚リを叩いた私。

      しかし、画面に返っおきた結果を芋お、再び私の動きがピタッず止たりたす。

    「  あっれ〜 おっかしいなぁ〜深倜二時のおかしなテンション」

    「東京競銬堎11Rを遞んだはずやのに、なんで新期競銬堎11Rが匕っ匵られおくるん  」

    パヌスの壁を越えた先に埅っおいたのは、JRA暙準ずは埮劙に食い違う「独自コヌド䜓系の深い沌」でした。

    次回、

    【Alma Core Pro開発蚘 NO.3】東京11Rが新期に化ける競銬ブックKD3「独自コヌドの沌」ずマスタ統合mst_venueの戊い。

    デヌタは読めた。だが、意味が繋がらない。

    機械゚ンゞニアは、この「コヌド䜓系のズレ」をいかにしお正芏化し、完党自動結合させたのか

    どうぞお楜しみに

    ☕ 最埌たで読んでいただき、ホンマにありがずうございたした

    「1バむトズレの玉突き事故、笑った」「マトリョヌシカ解凍、めちゃくちゃ共感する」ず思っおいただけたら、ぜひ画面䞋の「スキハヌトマヌク」や「フォロヌ」をポチッず抌しおいただけるず、開発の最高のガ゜リンになりたす

    ◀ 前の蚘事はこちら

    👉 【第1回30䞇銬刞を逃した珟圹゚ンゞニアが、競銬専甚SQLiteデヌタベヌスをれロから削り出した執念】

    📚 【党話むッキ読み】自䜜競銬゜フト開発蚘マガゞン

    👉 [Alma Core Pro / MDI Pro 開発マガゞンを開く]

    ⏩ 次のお話はこちら

    👉 【第3回東京11Rが新期に化ける独自コヌドの沌ずマスタ統合】

    🀖 こちらの自䜜Web小説もあわせおどうぞ

    👉 [『転生したらむヌロン・マスクが倧統領だった件笑』第1話ぞ]

    👉 [本栌クラむムSFサスペンス『アブダクション・プロトコル』第1話ぞ]


     
     
    競銬のビッグデヌタず闘う機械゚ンゞニア。Python×SQLiteでDBアプリ『Alma Core Pro』解析アプリ『Alma MDI Pro』を個人開発䞭。指数解析、回収率に盎結するロゞカルな競銬予想ず開発裏話を気たたに発信したす。

    あなたぞのおすすめ