要實作一個功能:
從 lua 檔案中提取字元串放到 excel 中,再将 excel 給海外同僚,翻譯完成後,用翻譯的文本替換相應中文。
整個功能并不複雜,要點有二點:
1、提取字元串,一行中文如“我是中文…”,中間可能會遇到”我是中文\”xx\”我是中文”,如果用正則\”[^\”]+\”則會比對失敗,思路就是先将\”替換,查找成功後再将其替換回來,excel中有三列,分别是:key、中文、待翻譯文本。
2、替換 lua 檔案中的中文,先将 excel 讀出來放到 Dictionary<string, string[]>對象中,然後逐行讀取 lua 檔案,拿到 key、中文,再從 Dictionary 中查找,滿足條件後則進行替換。
以繁體為例

為了防止出現:新增了一個 key,或者某個 key 對應的中文有修改,是以在替換的時候有嚴格的檢查。必須該行的 key、value,都存在于 excel 中,才替換相應的内容(僅一次)。
str9999="我是中文"--[["我是中文"]]
用string.Replace操作時,上面“我是中文”全部都被替換,不是所期望的。假設韓文或者越南文,我們肯定希望知道這個字元串所表示的含義,故特地将中文保留下來。new Regex().Replace 方法處理字元串嵌套比較麻煩,最後改為 string.Remove().Insert() 來處理。
講到這裡,基本都是在講該功能的一些實作細節。在替換我送出SVN的時候,我就發現,明明該lua檔案有3405行,但隻顯示3404行,最後一行是換行符,被幹掉了。然後我查代碼,發現沒問題,被狗吃了?
如果最後一行改為字元串,如a,行數顯示正常。 如果我額外加5行,顯示結果是3409,說明加的5行都識别了,并沒有對我添加的換行有特殊處理。
但最後一行換行就是不被讀取。是以,我懷疑ReadLine方法壓根就沒讀最後一行。查了一下官方文檔,找到了答案:
将行定義為後面的字元後跟一條順序列︰ 換行符 ("\n")、 回車符 ("\r") 或回車符後跟一條線換行符 ("\r\n")。 傳回的字元串不包含終止回車或換行。 傳回的值是 null 如果到達了輸入流的末尾。
所謂“終止”回車或換行,指的就是上面遇到的,檔案最後一行是如果是換行\回車,它不會讀取最後一行。
如果使用ReadLine對檔案進行行數統計,需要注意最後一個終止回車/換行并不會被讀取,不然得到的行數永遠會少1