摘要:[C#]讀檔切欄位存到DB,遇到中文字無法算準byte數
從大型主機下載下來的資料,通常都是TextFile
大都不會那麼好心幫你切割好
所以需要一份規格來看懂這一連串的字串意義
20091102A123456789A01987654321CCD電子感光元件RemarkRemark
類似這樣
拿到規格,就會跟你說,幾個字元是代表什麼欄位,
英數還好,遇到中文字就慘了,
大家都知道中文字是兩個byte,但是char是當一個
所以當我用string讀出時,在切字串就會有算錯的問題
用StreamReader去讀就像這樣的寫法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Text; namespace dennistest { class Class1 { public void main() { FileStream fs = new FileStream("dennis.txt", FileMode.Open); StreamReader sr = new StreamReader(fs, Encoding.Default); string s1 = ""; string s2 = ""; while (sr.Peek() >= 0) { s1 = sr.ReadLine(); s2 = s1.Substring(33, 12); } fs.Dispose(); sr.Dispose(); } } }
但是這樣出來的結果是"電子感光元件Remark"
找半天找不到StreamReader可以讀byte的方法,
讀出char再轉byte取,也是可以,只是要存進DB要再轉一次string
這個方法的code還蠻雜亂的,有興趣的人可以google一下
所以就參考前輩的做法,這是目前可以解決我問題的做法
(如果有人有更好的做法,麻煩告知我一下@@)
這個做法比較麻煩的是要先知道一列有多少byte,連同換行符號,這樣才能順利讀到下一筆資料
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Text; namespace dennistest { class Class1 { public void main() { FileStream fs = new FileStream("dennis.txt", FileMode.Open); string s2 = ""; int recordLen = 61; //每一列有多少btye int record = 61; //讀出來的有多少btye,如果長度不對表示結束 byte[] b = new byte[recordLen]; while (record == recordLen) { record = fs.Read(b, 0, recordLen); s2 = Encoding.GetEncoding(950).GetString(b, 33, 12); } fs.Dispose(); } } }
這樣出來的結果就是"電子感光元件"
第一個做法方便的是他直些ReadLine,我就不用去判斷要讀多少
還有StreamReader.Seek可以用
可惜遇到中文字就不適用