2014-11-02 145 views
-2

我有一個1000的文本文件,我想讀單到單,每個文件都有一個470萬的記錄,例如在文件中的行之一是:
如何讀取大文本文件?

43266200 6819   43295200 1393/05/23 14:28:45 113  1 

,我想保存到例如SQL服務器:

field1:43266200 
field2:6819 

我該怎麼做?

+0

每行(記錄)有多大?記錄的固定長度是多少?我建議使用StreamReader來避免可能出現的內存不足問題。 – Tim 2014-11-02 07:39:35

+0

如果您的文件足夠大,您可能需要[C#按行讀取文件行](http://stackoverflow.com/questions/1271225/c-sharp-reading-a-file-line-by-line)不想一次加載到內存中。 – mihai 2014-11-02 07:50:49

+1

所以你需要一本書告訴你如何閱讀一個文本文件?試過文件? – TomTom 2014-11-02 08:21:15

回答

1

這可能會幫助你

var message ="43266200 6819   43295200 1393/05/23 14:28:45 113  1"; 
//Split your data into pieces 
var messages=message.Split(' ').Where(o => !string.IsNullOrEmpty(o)); 
var i=0; 
foreach(var item in messages) 
{ 
    // do whatever you wanna to do with pieces 
    Console.Write("field {0}:{1}",++i,item); 
} 
+4

這將導致一堆空白字段,因爲你在一個空間分裂。最少使用'StringSplitOptions.RemoveEmpties'。 – Tim 2014-11-02 07:40:36

+0

感謝您的信息:) – 2014-11-02 07:44:34

1

如果你正在閱讀從文件中的文本,並且可以合理地假定空格字符將是你唯一的分隔符,你應該使用String.Split()方法來標記每行:

// instantiate FileInfo of your file as yourFile 

foreach (string line in yourFile.ReadLines()) 
{ 
    string[] lineTokens = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
} 

String.Split()允許你任何串分離成一個字符串[]基於所述char定界符你在第一個參數提供子串。上面代碼中的第二個參數是StringSplitOptions枚舉中的值之一,其值爲None(提供所有字符串)或RemoveEmptyEntries(不返回任何僅由分隔符字符組成的子字符串)。

然後,您可以從那裏遍歷lineTokens並從每個標記組裝一個對象,或者可以組裝任何給定索引對應於您要添加的行中列的SQL查詢。

2
var seperators = " ".ToCharArray(); 
foreach(var line in File.ReadLines(path)) 
{ 
    var fields = line.Split(seperators, StringSplitOptions.RemoveEmptyEntries); 
    //now you have fields[0] and fields[1], save them in your database 
} 
+0

ReadLines對於這樣的大文件(OutOfMemoryExceptions等)不可靠。線路到流式閱讀器應該表現更好。 – AFract 2014-11-02 08:40:47

+1

'ReadLines'返回'IEnumerable ',它被設計爲與大文件一起使用,因爲它只是在內存中獲取當前行而不是整個文件,也許你正在談論'ReadAllLines',它返回字符串[]並讀取整個文件一次。 – dotctor 2014-11-02 10:05:39

+0

你說得對,對不起。我實際上正在考慮ReadAllLines。 – AFract 2014-11-02 10:50:44