第328章 中文大寫金額!級聯填充!模板適配攻堅!

投票推薦 加入書籤 小說報錯

  三月十九號。周五。

  早上八點。遠望工作室。

  趙強已經在隔離機器前坐了一個小時。

  王經理昨天上午送來的那塊加密硬碟,裡面三份審計數據——製造企業的應收帳款明細、銀行對帳單、固定資產台帳——已經被他逐行掃了一遍。

  屏幕上是一張數據質量統計表。

  "結果出來了。"他看到林遠進來,直接報數。

  "三份數據,總行數八千九百多行。涉及IFRS三十九個輸出欄位中的三十二個——剩下七個欄位在這批數據里沒出現,後面如果遇到需要單獨處理。"

  "髒度呢?"

  "三類問題。"趙強切換到詳細報告。

  "第一類,空值。整體空值率百分之十七,其中應收帳款明細表最嚴重——二十二。主要分布在'對手方名稱''交易日期''備註'三個欄位。"

  "第二類,格式不統一。金額欄位最典型——同一列里有逗號分隔、純數字、中文大寫、括號負數四種寫法。日期欄位也有四種格式混用。"

  "第三類,結構性問題。合併單元格。固定資產台帳里有大量合併——一個'資產類別'欄位合併了五行到八行不等。解析出來就是第一行有值,下面的行是空。"

  林遠拉了把椅子坐下來,盯著屏幕看了一會兒。

  "比PwC的數據複雜多少?"

  "不是一個量級。"趙強說,"PwC的SOC 2日誌是系統自動生成的,格式雖然非標但有規律。德勤這批數據是審計師手工整理的Excel——人的隨意性比機器大得多。"

  "適配方案?"

  "昨晚想了一版。"趙強打開一個文本文件。"分三塊——第一塊,中文大寫金額轉換器。第二塊,合併單元格的級聯填充算法。第三塊,日期格式自動識別。三塊都做成獨立的預處理模塊,跑在模板引擎之前。"

  "思路對。"林遠說,"先做最難的那個——中文大寫金額。"

  上午十點。

  林遠坐在工位前,開始寫中文大寫金額轉換器的核心邏輯。

  代碼不複雜,但邊界條件多。

  他在草稿紙上先列了所有需要處理的字符映射——

  壹=1,貳=2,叄=3,肆=4,伍=5,陸=6,柒=7,捌=8,玖=9。

  拾=10,佰=100,仟=1000,萬=10000,億=100000000。

  元=小數點前結束,角=十分位,分=百分位。

  全網首發更新 TW 看書網解無聊,🅢🅗🅤.🅣🅦超方便

  "難點在哪?"趙強路過時看了一眼。

  "進位邏輯。"林遠說,"比如'壹佰貳拾叄萬肆仟伍佰陸拾柒元捌角玖分'——'萬'字是一個大單位,它前面的'壹佰貳拾叄'要先算成123,再乘以10000。然後'肆仟伍佰陸拾柒'是4567。兩部分加起來才是整數部分。"

  "如果只有'萬'沒有'仟佰拾'呢?比如'伍萬元整'?"

  "那就是50000。'萬'後面直接跟'元',中間沒有數字——意味著這一級是零。"

  "零怎麼處理?"

  "連續多個大寫數字之間如果沒有單位字,就是拼接關係——'壹貳'不是12,是不合法的。但如果遇到'零',比如'壹佰零叄元'——中間的'零'表示十位和個位之間跳了一級,值是103。"

  趙強想了一下。"邊界用例至少需要準備多少?"

  "兩百個。"林遠說,"整數部分、純小數、零的各種位置、極大值、負數——全覆蓋。寫完轉換器立刻跑回歸測試。"

  "多久能寫完?"

  "核心邏輯兩個小時。測試用例再加三個小時。下午五點之前能交。"

  下午三點。

  趙強的級聯填充算法也寫完了。

  "思路很簡單。"他演示給林遠看,"遍歷每一行,遇到某個欄位為空,就向上查找最近的非空值繼承過來。直到遇到新的非空值,切換繼承源。"

  "性能呢?"

  "八千行數據,處理時間不到一毫秒。"

  "邊界——如果第一行就是空的呢?"

  "那就沒有可繼承的值,標記為'數據缺失',輸出時走容錯路徑——欄位值寫null,容錯標記寫'原始數據缺失'。"

  "好。跟模板引擎的容錯機制能無縫對接。"

  趙強點頭。"還有一個細節——合併單元格有時候不是縱向的,是橫向的。比如'A1到D1合併',解析出來只有A1有值,B1、C1、D1都是空。"

  "橫向合併和縱向合併的區別?"

  "橫向是同一行不同列之間的合併——一般表示'這幾個欄位共享同一個值'。縱向是同一列不同行之間的合併——表示'這幾行屬於同一個分類'。"

  "橫向合併怎麼處理?"

  "需要檢測合併區域。Excel的合併單元格在XML層面有標記——mergedCells標籤。解析的時候先讀合併區域信息,再填充。"

  "加到算法里。"林遠說,"縱向級聯填充和橫向合併填充是兩個獨立模塊,但共用同一個預處理管線。"

  "已經在做了。"

  三月二十號。周六。


  蘇明遠收到徐經理的郵件——"第一批數據運行良好。審計團隊反饋格式完全符合SOC 2規範。我們準備把第二批數據也接入引擎。大約兩百條記錄,格式和第一批類似。預計下周發送。"

  "好消息。"蘇明遠說,"PwC開始信任我們了。"

  "第二批是好事,但也意味著引擎要從'能跑一次'升級到'能持續跑'。"林遠說,"讓趙強把部署文檔補完,加上監控和重啟流程。PwC的IT團隊要能獨立維護。"

  "已經在補了。"趙強頭都沒抬。

  同一天下午。ARM線有新進展。

  趙強的交叉編譯工具鏈已經跑通了。不只是Hello World——他把x86上跑通的模運算庫做了第一版ARM移植。

  "編譯通過,運行有問題。"他報告。

  "什麼問題?"

  "大數乘法溢出。x86上用的是64位整數乘法,結果放在128位的寄存器里。ARM上只有32位乘法指令——兩個32位數相乘,結果只保留低32位,高32位丟了。"

  "ARM沒有64位乘法?"

  "PXA255是ARMv5TE架構。有一條UMULL指令——無符號64位長乘法。輸入兩個32位數,輸出一個64位結果,存在兩個32位寄存器里。"

  "能用?"

  "能用,但需要改寫整個大數乘法的底層實現。x86上一條指令的事,ARM上要用UMULL加進位傳播——代碼量翻三倍。"

  "多久能改完?"

  "三天。"趙強說,"改完之後跑一輪單元測試,確認結果跟x86完全一致。"

  林遠點頭。"你改大數乘法,我繼續推混合坐標系的理論方案。"

  混合坐標系的核心思路已經成型——倍點操作用雅可比坐標,避免每次計算後的模逆運算;點加操作用仿射坐標,減少乘法次數。兩種坐標在關鍵路徑上做切換。

  "切換的代價是一次模逆。"他在草稿紙上算,"窗口寬度4,每輪做一次倍點鏈(4次倍點)加一次點加。如果倍點用雅可比坐標,4次倍點省了4次模逆。切換代價只有1次模逆。淨賺3次。"

  "3次模逆省下來——"

  "標量乘法整體速度再提升約15%。"林遠說,"加上Mersenne素數域優化的3.5倍和窗口法的加速——三個方向疊加,理論上能達到3500到4000次每秒。"

  "距離5000還差一步。"

  "最後一步靠ARM彙編級優化來補。等移植完成後,做性能基準,看實際數字在哪裡。不夠的話再想辦法。"

  晚上九點。

  白板上的任務清單——

  德勤:適配進行中。中文大寫轉換器 級聯填充 日期識別。明天聯調。3月22日截止。

  ARM:工具鏈 第一版移植有溢出問題→修復中。預計下周三完成。

  PwC:運行穩定。第二批數據下周接入。

  林遠站在白板前看了一會兒。

  德勤的適配進度比預想的快——三塊預處理模塊一天之內全部完成。但聯調才是真正的考驗。模塊單獨跑沒問題,拼到一起跑真實數據——一定會出新的問題。

  "明天是硬仗。"他對趙強說。

  "嗯。"趙強已經在收拾東西了。"聯調環境我晚上搭好。明天早上直接用德勤數據跑。"

  "好。"

  蘇明遠先走了。林遠關燈之前,看了一眼手機。

  陳嘉怡的消息——

  "韓委員問進度。我說一切正常。他說'期待月底見'。"

  林遠回了一個字:"好。"

  八天。


章節目錄