[C#]文字檔處理-檔案匯入

這邊處理要匯入的文字檔長度不一致的問題 導致無法使用字串切割來分割字串

這邊要處理一些匯入檔 像是從終端機拿出來的檔案

類似於電文  會嚴格的規定每個欄位的長度

要將這些內容切割出來放入資料庫

假設定義如下

欄位名稱 長度 說明
日期 8 yyyyMMdd
地址 10 ex:天龍國
狀態 1 0:未啟用 1:啟用
類別 1 0:帥 1:超帥 

假設內容如下

20170401天龍國    01
20170402台北      10
20170403林森北路  11

雖然看起來歪歪的 但是總長度實際上都是應該為20

但是在以前的機器上一個中文字佔了2個長度

在現在的機器上一個中文字佔了1個長度

先將上列內容存入字串內查看長度會分別為

17
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