[C#]讀檔切欄位存到DB,遇到中文字無法算準byte數

  • 8830
  • 0

摘要:[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可以用
可惜遇到中文字就不適用