第329章 聯調翻車!嵌套合併單元格!四十八小時極限修復!
三月二十一號。周日。
早上八點。遠望工作室。
趙強比林遠先到。
聯調環境昨晚已經搭好了——隔離機器上跑著預處理管線和模板引擎,兩份德勤真實數據已經加載到輸入隊列。
"準備?"林遠放下書包。
"隨時。"趙強打開監控面板。"流程是:原始數據→預處理管線(中文大寫轉換+級聯填充+日期識別)→模板引擎(IFRS三十九欄位映射)→標準JSON輸出。"
"從應收帳款明細開始。四千八百行,髒度最高。"
"好。"
趙強點擊運行。
預處理管線啟動。屏幕上刷出一行行處理日誌——
"第1行:格式識別→逗號型金額→轉換完成。"
"第2行:格式識別→純數字金額→轉換完成。"
"第3行:格式識別→中文大寫金額→轉換完成。"
前兩百行全部綠色。
然後——
"第217行:錯誤。中文大寫金額轉換失敗。輸入值:'零壹佰零叄元伍角'。"
趙強停了程序。
"'零壹佰零叄元伍角'。"林遠湊過來看,"開頭有個零。"
"中文大寫金額不應該以零開頭。"趙強說,"這是審計師手工錄入的錯誤——多打了一個'零'字。"
"預處理模塊怎麼處理這種異常?"
"現在的邏輯是——遇到無法解析的金額,直接標記為'轉換失敗',欄位值保留原始文本。"
"不行。"林遠說,"審計數據里這種錄入錯誤非常普遍。預處理模塊要有糾錯能力——開頭的零自動去掉,然後再解析。"
"如果中間有連續的零呢?比如'壹零零零叄元'?"
"那是10003——兩個單位字之間的零是跳位標記,不是多餘輸入。"林遠想了一下,"規則這樣寫:開頭的零視為錄入錯誤,自動去除;兩個單位字之間的零視為跳位,保留。區分標準是——零後面跟的是單位字還是數字字。"
"明白。"趙強已經開始改代碼。
上午十一點。第一個bug修完。
重新跑應收帳款明細。
【寫到這裡我希望讀者記一下我們域名𝚃𝚆看書網→𝚜𝚑𝚞.𝚝𝚠】
前五百行全部通過。
然後——
"第531行:錯誤。級聯填充異常。欄位'資產類別'值繼承鏈斷裂。"
趙強調出原始數據。
"看這裡。"他指著屏幕,"合併單元格的層級——第一行'固定資產'合併了A1到A5,第二行'機器設備'合併了A6到A12。但在A13——又出現了'固定資產',沒有合併標記,是一個普通單元格。"
"三級嵌套。"林遠皺眉。
"對。前兩級的合併單元格有XML標記,級聯填充能處理。但第三級——A13是普通單元格,不是合併區域的一部分。級聯填充把它當成一個獨立的新值,覆蓋了前面的繼承鏈。後面A14到A20全是空值,應該繼承A13的'固定資產',但繼承鏈斷了。"
"問題出在哪?"
"級聯填充只處理了合併單元格區域的向前填充。遇到非合併區域的獨立單元格打斷繼承鏈的情況——沒有處理。"
林遠坐下來想了一分鐘。
"加一層邏輯。"他說,"在級聯填充之前,先做一次'繼承錨點'掃描。不管是不是合併單元格,只要某個單元格的值和上一行相同或者屬於同一分類體系——就認定為同一個繼承域。"
"怎麼判斷'屬於同一分類體系'?"
"關鍵詞匹配。"林遠說,"固定資產台帳里的分類是有層級的——一級分類就那幾個:固定資產、無形資產、投資性房地產。二級分類在一級下面。如果遇到一個值能匹配到一級分類的關鍵詞——它就是新的錨點,不管它是不是合併單元格。"
"用關鍵詞白名單?"
"對。先把一級分類的關鍵詞提取出來——從數據本身統計。出現頻率最高、且後面跟著大量空值行的那些值,就是一級分類。"
趙強點頭。"這個思路好。不依賴Excel的合併標記,而是從數據本身的分布推斷層級結構。"
"改多久?"
"兩個小時。"
"中午之前能搞定?"
"能。"
下午兩點。
第二個bug修完。趙強加了繼承錨點掃描模塊——先從數據里自動提取一級分類關鍵詞,然後在級聯填充時以這些關鍵詞為錨點重建繼承鏈。
重新跑。
前兩千行——全部綠色。
趙強臉上露出了一絲放鬆的表情。
然後——
"第2147行:錯誤。日期格式識別失敗。輸入值:'二〇〇三年十二月三十一日'。"
"中文日期。"林遠說。
"之前的日期識別模塊覆蓋了四種格式——斜槓分隔、短橫線、純數字、'12月31日2003年'。但這種用中文數字寫的——'二〇〇三年'——沒有覆蓋。"
"中文數字和中文大寫不一樣。"趙強說,"大寫是'壹貳叄',這裡是'一二三'——用的是普通漢字數字。而且年份用的是'〇'不是'零'。"
"加一組規則。"林遠說,"中文日期格式:'X年Y月Z日',其中X是中文年份(用'〇一二三四五六七八九'),Y和Z是中文月份和日期(可能用'十''二十''三十')。"
"轉換邏輯?"
"先用一個映射表把中文數字轉成阿拉伯數字——〇=0,一=1,二=2……十=10。然後處理組合——'十二'=12,'二十'=20,'二十三'=23。最後輸出標準格式YYYY-MM-DD。"
"不複雜,但組合情況多。"
"先覆蓋這批數據里出現的格式。"林遠說,"不要過度設計。把德勤三份數據里所有日期格式的樣本抽出來,逐一覆蓋。"
趙強用腳本跑了個統計。"三份數據里一共有七種日期格式。之前的模塊覆蓋了四種。剩下三種——中文日期、帶中文月份的混合格式、還有一個用'.'分隔的——'2003.12.31'。"
"兩種要新寫規則,一種加個分隔符匹配就行。"
"一個小時。"
晚上七點。
三個bug全部修完。
趙強重新運行全量測試。
八千九百多行數據,三份文件,全部進入預處理管線。
日誌瘋狂刷屏。
趙強盯著屏幕,一行一行看。
十分鐘。
二十分鐘。
"最後一行——"
日誌停住了。
趙強的心跳快了一拍。
三秒後——
"處理完成。總行數:8,927。成功:8,927。失敗:0。"
零失敗。
林遠靠在椅背上,長長地呼了一口氣。
"過模板引擎。"
趙強把預處理後的數據導入模板引擎。IFRS三十九欄位映射開始運行。
又是十分鐘的等待。
"轉換完成。總行數:8,927。成功:8,927。平均耗時:五十三毫秒。欄位完整率:百分之九十九點二。"
"百分之九十九點二——剩下的0.8%是什麼?"
"原始數據中確實不存在的欄位。不是轉換失敗,是源數據本身就沒有這個信息。容錯標記為'未披露'。"
"正確行為。"林遠說,"引擎不該憑空編造數據。源數據沒有,就標'未披露'。"
他看了一眼時間。晚上七點二十五分。
三月二十一號,周日。距離截止日還有——
"不到二十四小時。"趙強說。
"夠了。"林遠站起來,"跑第二輪全量回歸。我從頭到尾看一遍輸出樣本。確認每個欄位的映射邏輯都沒問題。"
"好。"
三月二十二號。周一。
早上九點。
林遠把全量測試報告打包,發給陳嘉怡。
附件包含三部分內容——
第一,數據質量分析報告:三份數據的髒度統計、七種日期格式、四種金額格式、三級嵌套合併單元格。
第二,適配方案文檔:預處理管線架構、中文大寫金額轉換器、級聯填充算法(含繼承錨點掃描)、日期格式自動識別、容錯處理邏輯。
第三,全量測試結果:8,927行數據,零轉換失敗,欄位完整率99.2%,平均轉換耗時53毫秒。
郵件最後附了一句話——
"模板適配完成。隨時可以進行實操Demo。"
發送。
趙強靠在椅子上。"兩天。從零開始到全量通過——兩天。"
"不是從零開始。"林遠說,"模板引擎的架構是兩周前就設計好的。我們做的不是造引擎——是給引擎裝零件。三個預處理模塊加兩個bug修復。架構不變,零件按需加。"
"這就是你說的'加一套模板就支持一套新標準'?"
"不只是加模板。"林遠說,"是加預處理能力。每處理一種髒數據,引擎就多一種適應性。PwC的SOC 2數據教了引擎處理非標準Syslog。德勤的IFRS數據教了引擎處理中文大寫、合併單元格、多種日期格式。這些能力是通用的——下一家客戶,不管用什麼標準,引擎都能接。"
趙強想了想。"引擎在進化。"
"對。"林遠說,"每處理一種真實數據,就進化一次。
早上八點。遠望工作室。
趙強比林遠先到。
聯調環境昨晚已經搭好了——隔離機器上跑著預處理管線和模板引擎,兩份德勤真實數據已經加載到輸入隊列。
"準備?"林遠放下書包。
"隨時。"趙強打開監控面板。"流程是:原始數據→預處理管線(中文大寫轉換+級聯填充+日期識別)→模板引擎(IFRS三十九欄位映射)→標準JSON輸出。"
"從應收帳款明細開始。四千八百行,髒度最高。"
"好。"
趙強點擊運行。
預處理管線啟動。屏幕上刷出一行行處理日誌——
"第1行:格式識別→逗號型金額→轉換完成。"
"第2行:格式識別→純數字金額→轉換完成。"
"第3行:格式識別→中文大寫金額→轉換完成。"
前兩百行全部綠色。
然後——
"第217行:錯誤。中文大寫金額轉換失敗。輸入值:'零壹佰零叄元伍角'。"
趙強停了程序。
"'零壹佰零叄元伍角'。"林遠湊過來看,"開頭有個零。"
"中文大寫金額不應該以零開頭。"趙強說,"這是審計師手工錄入的錯誤——多打了一個'零'字。"
"預處理模塊怎麼處理這種異常?"
"現在的邏輯是——遇到無法解析的金額,直接標記為'轉換失敗',欄位值保留原始文本。"
"不行。"林遠說,"審計數據里這種錄入錯誤非常普遍。預處理模塊要有糾錯能力——開頭的零自動去掉,然後再解析。"
"如果中間有連續的零呢?比如'壹零零零叄元'?"
"那是10003——兩個單位字之間的零是跳位標記,不是多餘輸入。"林遠想了一下,"規則這樣寫:開頭的零視為錄入錯誤,自動去除;兩個單位字之間的零視為跳位,保留。區分標準是——零後面跟的是單位字還是數字字。"
"明白。"趙強已經開始改代碼。
上午十一點。第一個bug修完。
重新跑應收帳款明細。
【寫到這裡我希望讀者記一下我們域名𝚃𝚆看書網→𝚜𝚑𝚞.𝚝𝚠】
前五百行全部通過。
然後——
"第531行:錯誤。級聯填充異常。欄位'資產類別'值繼承鏈斷裂。"
趙強調出原始數據。
"看這裡。"他指著屏幕,"合併單元格的層級——第一行'固定資產'合併了A1到A5,第二行'機器設備'合併了A6到A12。但在A13——又出現了'固定資產',沒有合併標記,是一個普通單元格。"
"三級嵌套。"林遠皺眉。
"對。前兩級的合併單元格有XML標記,級聯填充能處理。但第三級——A13是普通單元格,不是合併區域的一部分。級聯填充把它當成一個獨立的新值,覆蓋了前面的繼承鏈。後面A14到A20全是空值,應該繼承A13的'固定資產',但繼承鏈斷了。"
"問題出在哪?"
"級聯填充只處理了合併單元格區域的向前填充。遇到非合併區域的獨立單元格打斷繼承鏈的情況——沒有處理。"
林遠坐下來想了一分鐘。
"加一層邏輯。"他說,"在級聯填充之前,先做一次'繼承錨點'掃描。不管是不是合併單元格,只要某個單元格的值和上一行相同或者屬於同一分類體系——就認定為同一個繼承域。"
"怎麼判斷'屬於同一分類體系'?"
"關鍵詞匹配。"林遠說,"固定資產台帳里的分類是有層級的——一級分類就那幾個:固定資產、無形資產、投資性房地產。二級分類在一級下面。如果遇到一個值能匹配到一級分類的關鍵詞——它就是新的錨點,不管它是不是合併單元格。"
"用關鍵詞白名單?"
"對。先把一級分類的關鍵詞提取出來——從數據本身統計。出現頻率最高、且後面跟著大量空值行的那些值,就是一級分類。"
趙強點頭。"這個思路好。不依賴Excel的合併標記,而是從數據本身的分布推斷層級結構。"
"改多久?"
"兩個小時。"
"中午之前能搞定?"
"能。"
下午兩點。
第二個bug修完。趙強加了繼承錨點掃描模塊——先從數據里自動提取一級分類關鍵詞,然後在級聯填充時以這些關鍵詞為錨點重建繼承鏈。
重新跑。
前兩千行——全部綠色。
趙強臉上露出了一絲放鬆的表情。
然後——
"第2147行:錯誤。日期格式識別失敗。輸入值:'二〇〇三年十二月三十一日'。"
"中文日期。"林遠說。
"之前的日期識別模塊覆蓋了四種格式——斜槓分隔、短橫線、純數字、'12月31日2003年'。但這種用中文數字寫的——'二〇〇三年'——沒有覆蓋。"
"中文數字和中文大寫不一樣。"趙強說,"大寫是'壹貳叄',這裡是'一二三'——用的是普通漢字數字。而且年份用的是'〇'不是'零'。"
"加一組規則。"林遠說,"中文日期格式:'X年Y月Z日',其中X是中文年份(用'〇一二三四五六七八九'),Y和Z是中文月份和日期(可能用'十''二十''三十')。"
"轉換邏輯?"
"先用一個映射表把中文數字轉成阿拉伯數字——〇=0,一=1,二=2……十=10。然後處理組合——'十二'=12,'二十'=20,'二十三'=23。最後輸出標準格式YYYY-MM-DD。"
"不複雜,但組合情況多。"
"先覆蓋這批數據里出現的格式。"林遠說,"不要過度設計。把德勤三份數據里所有日期格式的樣本抽出來,逐一覆蓋。"
趙強用腳本跑了個統計。"三份數據里一共有七種日期格式。之前的模塊覆蓋了四種。剩下三種——中文日期、帶中文月份的混合格式、還有一個用'.'分隔的——'2003.12.31'。"
"兩種要新寫規則,一種加個分隔符匹配就行。"
"一個小時。"
晚上七點。
三個bug全部修完。
趙強重新運行全量測試。
八千九百多行數據,三份文件,全部進入預處理管線。
日誌瘋狂刷屏。
趙強盯著屏幕,一行一行看。
十分鐘。
二十分鐘。
"最後一行——"
日誌停住了。
趙強的心跳快了一拍。
三秒後——
"處理完成。總行數:8,927。成功:8,927。失敗:0。"
零失敗。
林遠靠在椅背上,長長地呼了一口氣。
"過模板引擎。"
趙強把預處理後的數據導入模板引擎。IFRS三十九欄位映射開始運行。
又是十分鐘的等待。
"轉換完成。總行數:8,927。成功:8,927。平均耗時:五十三毫秒。欄位完整率:百分之九十九點二。"
"百分之九十九點二——剩下的0.8%是什麼?"
"原始數據中確實不存在的欄位。不是轉換失敗,是源數據本身就沒有這個信息。容錯標記為'未披露'。"
"正確行為。"林遠說,"引擎不該憑空編造數據。源數據沒有,就標'未披露'。"
他看了一眼時間。晚上七點二十五分。
三月二十一號,周日。距離截止日還有——
"不到二十四小時。"趙強說。
"夠了。"林遠站起來,"跑第二輪全量回歸。我從頭到尾看一遍輸出樣本。確認每個欄位的映射邏輯都沒問題。"
"好。"
三月二十二號。周一。
早上九點。
林遠把全量測試報告打包,發給陳嘉怡。
附件包含三部分內容——
第一,數據質量分析報告:三份數據的髒度統計、七種日期格式、四種金額格式、三級嵌套合併單元格。
第二,適配方案文檔:預處理管線架構、中文大寫金額轉換器、級聯填充算法(含繼承錨點掃描)、日期格式自動識別、容錯處理邏輯。
第三,全量測試結果:8,927行數據,零轉換失敗,欄位完整率99.2%,平均轉換耗時53毫秒。
郵件最後附了一句話——
"模板適配完成。隨時可以進行實操Demo。"
發送。
趙強靠在椅子上。"兩天。從零開始到全量通過——兩天。"
"不是從零開始。"林遠說,"模板引擎的架構是兩周前就設計好的。我們做的不是造引擎——是給引擎裝零件。三個預處理模塊加兩個bug修復。架構不變,零件按需加。"
"這就是你說的'加一套模板就支持一套新標準'?"
"不只是加模板。"林遠說,"是加預處理能力。每處理一種髒數據,引擎就多一種適應性。PwC的SOC 2數據教了引擎處理非標準Syslog。德勤的IFRS數據教了引擎處理中文大寫、合併單元格、多種日期格式。這些能力是通用的——下一家客戶,不管用什麼標準,引擎都能接。"
趙強想了想。"引擎在進化。"
"對。"林遠說,"每處理一種真實數據,就進化一次。