2012年1月17日 星期二

薪資媒體申報檔200->250字

今年(2012)1月要各個公司要為每個員工申報去年的薪資所得, 因為過年的關係, 好像可以延到2月。不過, 今年的中英文媒體申報檔格式有改動, 由原來的200字, 改成250字。主要是要容納更多的資料。例如, 名字部份加長了。
可是我們這些公司的系統, 並沒有這些需要, 反而是要因應這些變動, 而要改寫系統產出的文字檔格式。如果我們有10個系統, 那就要改10支程式。想想, 有點笨; 所以, 最後只寫了一支程式, 用來將原本200字的文字檔, 改成250字文字檔格式。那麼原本的10個系統都不用動, 也不用測試。還好, 使用者也能接受, 因為問題不是我們造成的, 要怪, 也只能怪國稅局了。
其實國稅局的申報程式, 應該有兩個功能, 一個可以讀200字的中英文合併檔, 一個可以讀新的250字的中英文合併檔, 那就皆大歡喜。
不過, 在那之前, 使用者急著申報作業, 我們還是把轉檔程式做好先。
我用C#的Windows Form來寫, 因為可以XCOPY部署, 還蠻方便的。程式只有三個輸入:
1. 舊的中英文合併檔檔名(完整路徑)    ----> tbFileName
2. 所得期間(起) (3碼年, 2碼月; 民國年)-----> tbStart
3. 所得期間(迄) (3碼年, 2碼月; 民國年)-----> tbEnd

Button按下後的程式:
Encoding ec = Encoding.GetEncoding("Big5");
            StreamReader rdr = new StreamReader(tbFileName.Text, ec);
            StreamWriter wtr = new StreamWriter(tbFileName.Text.ToString() + ".250", false, ec);
            string space28 = new string(' ', 28);
            string period = tbStart.Text + tbEnd.Text;
            string space12 = new string(' ', 12);
            while (!rdr.EndOfStream)
            {
                string line = rdr.ReadLine();
                byte[] encoded = ec.GetBytes(line);
                //MessageBox.Show(line.Length.ToString());
                string part1 = new string(ec.GetChars(encoded, 0, 92));
                string part2 = new string(ec.GetChars(encoded, 92, 60));
                string part3 = new string(ec.GetChars(encoded, 152, 37));
                string part4 = new string(ec.GetChars(encoded, 189, 11));
                string line_250 = part1 + space28 + part2 + period + part3 + space12 + part4;
                wtr.WriteLine(line_250);
            }
            rdr.Close();
            wtr.Close();

這樣, 就簡單的解決了國稅局給的問題了。
程式其實很簡單, 只是把原檔案的資料取出, 再依新格式加入一些空白字元, 湊成250字就好了。比較討厭的是編碼的問題, 這個檔案是早期的BIG5編碼, 現在的電腦都已改為預設為Unicode, 所以要特別處理一下。不能直接字串相加就搞定。
張貼留言