這邊處理要匯入的文字檔長度不一致的問題 導致無法使用字串切割來分割字串
這邊要處理一些匯入檔 像是從終端機拿出來的檔案
類似於電文 會嚴格的規定每個欄位的長度
要將這些內容切割出來放入資料庫
假設定義如下
欄位名稱 | 長度 | 說明 |
日期 | 8 | yyyyMMdd |
地址 | 10 | ex:天龍國 |
狀態 | 1 | 0:未啟用 1:啟用 |
類別 | 1 | 0:帥 1:超帥 |
假設內容如下
20170401天龍國 01
20170402台北 10
20170403林森北路 11
20170402台北 10
20170403林森北路 11
雖然看起來歪歪的 但是總長度實際上都是應該為20
但是在以前的機器上一個中文字佔了2個長度
在現在的機器上一個中文字佔了1個長度
先將上列內容存入字串內查看長度會分別為
17
18
16
18
16
如果我用substring來切字串肯定會出錯
所以想了一個方法
先將讀取的字串轉換成Byte[]
byte[] byteLine = Encoding.GetEncoding("big5").GetBytes(line);
這樣去查看byteLine.Length的長度會是正確的20
之後宣告其他的byte[] 然後將正確內容複製到各個所定義的byte[]裡面
byte[] date = new byte[8];
byte[] address = new byte[10];
byte[] status = new byte[1];
byte[] type = new byte[1];
Array.Copy(byteLine, 0, date, 0, 8);
Array.Copy(byteLine, 8, address, 0, 10);
Array.Copy(byteLine, 18, status, 0, 1);
Array.Copy(byteLine, 19, type, 0, 1);
之後再把byte[]轉回字串放進你想放進的Model就好拉~
Model model = new Model()
{
date = System.Text.Encoding.Default.GetString(date).Trim(),
address = System.Text.Encoding.Default.GetString(address).Trim(),
status = System.Text.Encoding.Default.GetString(status).Trim(),
type = System.Text.Encoding.Default.GetString(type).Trim()
};
完整程式碼如下
foreach (string line in File.ReadLines(Path.Combine(path, fileName),Encoding.Default))
{
byte[] byteLine = Encoding.GetEncoding("big5").GetBytes(line);
byte[] date = new byte[8];
byte[] address = new byte[10];
byte[] status = new byte[1];
byte[] type = new byte[1];
Array.Copy(byteLine, 0, date, 0, 8);
Array.Copy(byteLine, 8, address, 0, 10);
Array.Copy(byteLine, 18, status, 0, 1);
Array.Copy(byteLine, 19, type, 0, 1);
Model model = new Model()
{
date = System.Text.Encoding.Default.GetString(date).Trim(),
address = System.Text.Encoding.Default.GetString(address).Trim(),
status = System.Text.Encoding.Default.GetString(status).Trim(),
type = System.Text.Encoding.Default.GetString(type).Trim()
};
}
Refernce
https://msdn.microsoft.com/zh-tw/library/ms404377%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396