天天看點

一個換行符引發的思考!

0、背景

在生成注冊号開發中,初步的規律已經得到。整個某省分為175個區域,累計注冊号>1億條。

生成注冊号的前期程式都是在程式裡面構造的,且充分驗證ok,某區域的有效資料累計2萬條為證據。

為了實作程式自動化生成一個省的所有注冊記錄,特采取了讀配置的政策。如:前6位機關号寫入配置檔案。

結果就跑了4個小時以上生成了近一億條資料。本來,到這裡也就完了。

可是,Bug出現了。

當我在将近2萬條實驗成功的資料導入到新表中時,發現前14位相同的注冊号,第15位注冊号竟然不同。

很明顯是有Bug了。

一個換行符引發的思考!

1、Bug溯源

加日志列印後,症狀:正常列印應該為:”str1=270000001800015”,

實際輸出結果為:00015=2700000018。

有明顯的錯亂,記憶體越界的痕迹。

步驟1——初步想到的是:棧變量記憶體配置設定的問題。

(1)配置了空間過大,改成同樣大小14個長度的位元組數。 驗證後,錯誤結果依舊。

(2)改成堆記憶體配置設定,每次進入循環配置設定記憶體,退出循環釋放記憶體。驗證後,錯誤結果依舊。

此過程反反複複,接近20分鐘。

步驟2——進一步跟蹤,字元串的每一個字元都列印出來。當以10進制列印字元的時候,明顯的第7個字元那裡有很大存在某種問題或陰謀。

再仔細想。前6個字元是從檔案中讀入的。多了個回車符。

步驟3——初步敲定原因。

為了編碼的友善,我在windows下編輯的檔案,機關号(前6位)是直接從構造好的Excel中拷貝過去的。

這就導緻了如下内容:

(1)結束符導緻讀到的第7個字元為回車符”r”,不正确。

(2)導緻序列号的第7-15位向前錯1位。

(3)最終導緻出現驗證碼出錯。

整個過程下來耗費近1個小時時間。

2、解決方案:

dos2unix 轉為unix下的檔案格式。

Centos 環境下執行:dos2unix *.txt

3、知識點備忘

(1)換行符:

1).windows中的換行符是rn,

2). linux/unix下的換行符是n。

其中:

回車符:r=0x0d (13) return; #回車

換行符:n=0x0a (10) newline。#換行

(2) unix2dos指令詳解:

對應的将UNIX格式文本檔案轉成成DOS格式的是unix2dos指令。

dos2unix指令用來将DOS格式的文本檔案轉換成UNIX格式的(DOS/MAC to UNIX text file format converter)。

再次強調:

DOS下的文本檔案是以rn作為斷行标志的,表示成十六進制就是0D 0A。

而Unix下的文本檔案是以n作為斷行标志的,表示成十六進制就是 0A。

DOS格式的文本檔案在Linux底下,用較低版本的vi打開時行尾會顯示^M,而且很多指令都無法很好的處理這種格式的檔案,如果是個shell腳本。

而Unix格式的文本檔案在Windows下用Notepad打開時會拼在一起顯示。是以産生了兩種格式檔案互相轉換的需求。

4、結語

(1)dos2unix轉換是在公司裡面非常常用的指令。最近一段時間由于用的少,竟然給忘記。險些誤了大事。

(2)遇見Bug,不要慌張,多角度思考。同理的下午兩表合并的Bug,最終我的解決方案改為:解析原有2萬多條有效資料的表,然後解析的同時,将結果Update到新表中。效率相對較高。

(3)換一個思路,或許會“柳暗花明”、“豁然開朗”。同時操作一個表導緻的死鎖問題,最終的解決方案就是通過: show processlist;找到Locked Id, 然後kill 對應Id掉即可。

一個換行符引發的思考!

作者:銘毅天下

轉載請标明出處,原文位址:

http://blog.csdn.net/laoyang360/article/details/52705922

繼續閱讀