概述:
文本文件是一種非常常用的文件格式,因其通用的閱讀方式而經常被用做不同單位的數據交換文件格式。
文本文件需要能夠正確導入數據庫,
必須要滿足以下兩個條件其中之一:
1:文本文件的結構格式固定,長度固定.
2:文本文件每行長度不固定,但每個字段之間有特殊符號分開.
本文給出的是滿足條件1的文本文件導入到數據庫的解決方法,對於滿足條件2的文本文件,道理類似,
有興趣的朋友可以自行測試,如有問題,歡迎交流和溝通!
文本文件是一種非常常用的文件格式,因其通用的閱讀方式而經常被用做不同單位的數據交換文件格式。
文本文件需要能夠正確導入數據庫,
必須要滿足以下兩個條件其中之一:
1:文本文件的結構格式固定,長度固定.
2:文本文件每行長度不固定,但每個字段之間有特殊符號分開.
本文給出的是滿足條件1的文本文件導入到數據庫的解決方法,對於滿足條件2的文本文件,道理類似,
有興趣的朋友可以自行測試,如有問題,歡迎交流和溝通!
一:問題描述:
這是老婆大人單位的一個項目,需求其實還是比較清晰的:要求編寫Asp.Net程序,自動讀取每天生成的文本文件,
根據業務邏輯處理後,保存到SQLSERVER數據庫。
文本格式定義:
1:每一行具有相同固定格式,一行就對應於數據庫中的一條記錄,記錄的每個字段都有明確的長度定義。
2:每一行文本都是連續的,中間沒有任何的特殊的符號來區分不同的字段。
3:文本中有英文字母和數字,也可能有中文漢字。
4:格式規定,一個英文字母或數字對應的長度爲1,中文漢字對應的長度爲2.
根據項目需求分析,整個需求並不複雜,一般來說,文本文件需要能夠正確導入數據庫,
必須要滿足以下兩個條件其中之一:
1:文本文件的結構格式固定,長度固定.
2:文本文件每行長度不固定,但每個字段之間有特殊符號分開.
根據業務邏輯處理後,保存到SQLSERVER數據庫。
文本格式定義:
1:每一行具有相同固定格式,一行就對應於數據庫中的一條記錄,記錄的每個字段都有明確的長度定義。
2:每一行文本都是連續的,中間沒有任何的特殊的符號來區分不同的字段。
3:文本中有英文字母和數字,也可能有中文漢字。
4:格式規定,一個英文字母或數字對應的長度爲1,中文漢字對應的長度爲2.
根據項目需求分析,整個需求並不複雜,一般來說,文本文件需要能夠正確導入數據庫,
必須要滿足以下兩個條件其中之一:
1:文本文件的結構格式固定,長度固定.
2:文本文件每行長度不固定,但每個字段之間有特殊符號分開.
上述需求滿足條件1,肯定可以能正確導入到數據庫。
二:初步的解決思路和步驟
1:讀取文本文件內容到數據流StreamReader
2:開始事務
3:循環從數據流中讀取每一行到字符串,按表結構定義通過SubString函數對字符串進行截取到每一個字段變量。
4:定義SQL存儲過程,傳入步驟3中的每個字段值,在存儲過程中完成每條記錄的插入!
5:執行事務
6:事務回滾
7:錯誤消息捕捉,返回友好信息提示
8:釋放相關資源
1:讀取文本文件內容到數據流StreamReader
2:開始事務
3:循環從數據流中讀取每一行到字符串,按表結構定義通過SubString函數對字符串進行截取到每一個字段變量。
4:定義SQL存儲過程,傳入步驟3中的每個字段值,在存儲過程中完成每條記錄的插入!
5:執行事務
6:事務回滾
7:錯誤消息捕捉,返回友好信息提示
8:釋放相關資源
三:實際開發中出現的問題與解決方法
問題:
實際的程序中,按照文本文件定義的字段長度進行字符串截取,取出來的字符串長度與實際長度不一致,不論是使用bg2312編碼還是默認編碼。 具體現象通過調試跟蹤,在C#中,不論是英文字母還是漢字,取出來的長度也是1,而不是如文本文件中規定的那樣,漢字長度爲2.導致整個字符串與實際定義的長度不一致,所以在用SubString()函數截取字符串時,無法根據數據結構定義中的長度正確取得每個字段值。
原因分析:
問題原因很明顯是編碼格式出現問題,漢字保存在磁盤中的編碼有多種,常見的有:GB、BIG5 、Unicode、UTF-7、UTF-8等。在文本文件讀取過程中, 文件的編碼(Encoding)和StreamReader/Writer指定的Encoding不對應,就會出現亂碼問題。雖然StreamReader可以根據文本文件格式自動識別編碼格 式,正確讀取不同編碼格式的文本文件。但對於字符串來說,是無法識別字符串中的中文字符與英文,數字的區別,統一都作用長度爲1處理。正確的處 理方法是使用將字符串轉換爲字節數組,對字節數組按文本文件定義的字段長度讀取每個字段值。
問題:
實際的程序中,按照文本文件定義的字段長度進行字符串截取,取出來的字符串長度與實際長度不一致,不論是使用bg2312編碼還是默認編碼。 具體現象通過調試跟蹤,在C#中,不論是英文字母還是漢字,取出來的長度也是1,而不是如文本文件中規定的那樣,漢字長度爲2.導致整個字符串與實際定義的長度不一致,所以在用SubString()函數截取字符串時,無法根據數據結構定義中的長度正確取得每個字段值。
原因分析:
問題原因很明顯是編碼格式出現問題,漢字保存在磁盤中的編碼有多種,常見的有:GB、BIG5 、Unicode、UTF-7、UTF-8等。在文本文件讀取過程中, 文件的編碼(Encoding)和StreamReader/Writer指定的Encoding不對應,就會出現亂碼問題。雖然StreamReader可以根據文本文件格式自動識別編碼格 式,正確讀取不同編碼格式的文本文件。但對於字符串來說,是無法識別字符串中的中文字符與英文,數字的區別,統一都作用長度爲1處理。正確的處 理方法是使用將字符串轉換爲字節數組,對字節數組按文本文件定義的字段長度讀取每個字段值。
四:修正的解決思路
1:讀取文本文件內容到數據流StreamReader
2:開始事務
3:循環從數據流中讀取每一行到字符串,並轉換爲字節數組。按表結構定義對字節數組進行截取到每一個字段變量。
4:定義SQL存儲過程,傳入步驟3中的每個字段值,在存儲過程中完成每條記錄的插入!
5:執行事務
6:事務回滾
7:錯誤消息捕捉,返回友好信息提示
8:釋放相關資源
2:開始事務
3:循環從數據流中讀取每一行到字符串,並轉換爲字節數組。按表結構定義對字節數組進行截取到每一個字段變量。
4:定義SQL存儲過程,傳入步驟3中的每個字段值,在存儲過程中完成每條記錄的插入!
5:執行事務
6:事務回滾
7:錯誤消息捕捉,返回友好信息提示
8:釋放相關資源
五:相關的文本文件處理函數參考,完整的源碼見附件
因有不少朋友通過留言,希望提供DataAccess類源碼,現提供源碼,見鏈接: