2013年11月20日星期三

从文本文件中的表读取到二维数组与DataTable并在listbox中展示其中的一列



自己做的一个winform小工具中,有一个listbox,我想在每次程序启动时从本地一个文件中读出数据,将其中的一列展示在listbox中,而且数据要保存在内存中,供之后的功能调用。查论坛说filestream方式读取文件比较好,而且可以每次只读一行,对于很大的文件也可以轻松应付,虽然我的文件不可能那么大,但是为了练习也采用了这种办法。filestream中的ReadLine()方法也可以得出文件的行数,以下是源代码:
[csharp] view plaincopy
  1. StreamReader streamreader = new StreamReader(FileOperation.folderfile);  
  2. string line;  
  3. while ((line = streamreader.ReadLine()) != null)  
  4. {  
  5.     string[] readrow = line.Split(new char[] { '\t' });  
  6.     int m = 1;  
  7.     int n = readrow.Length;  
  8.     string[,] fields = new string[m, n];  
  9.     for (int i = 0; i < n; i++)  
  10.         fields[i / n, i % n] = readrow[i];  
  11.     listBox_folders.Items.Add(fields[m-1, 0]);  
  12.     m++;  
  13. }  
具体的办法是通过循环将文件的每行都读出存入一个一维数组,再用一个for循环将这个一维数组的数据存入一个二维数组的一行,二维数组的列数由一维数组的长度取得,行数则随着ReadLine()的循环自增,最后listbox展示的是这个二维数组的第1列。

补:
随后的操作过程中,需要多次对该数组进行增删改操作,发现数组的操作很麻烦,于是只好重新来过,将数组改为DataTable类型,DataTable获取行数列数,索引,增删改操作都相当便利,而且我也熟悉,代码如下:
[csharp] view plaincopy
  1. StreamReader streamreader = new StreamReader(FileOperation.folderfile);  
  2. string line;  
  3. DataTable dt_folders = new DataTable();  
  4. DataColumn name = new DataColumn("Name", Type.GetType("System.String"));  
  5. DataColumn folder = new DataColumn("Folder", Type.GetType("System.String"));  
  6. DataColumn username = new DataColumn("UserName", Type.GetType("System.String"));  
  7. DataColumn password = new DataColumn("Password", Type.GetType("System.String"));  
  8. DataColumn protocol = new DataColumn("Protocol", Type.GetType("System.String"));  
  9. DataColumn port = new DataColumn("Port", Type.GetType("System.String"));  
  10. dt_folders.Columns.Add(name);  
  11. dt_folders.Columns.Add(folder);  
  12. dt_folders.Columns.Add(username);  
  13. dt_folders.Columns.Add(password);  
  14. dt_folders.Columns.Add(protocol);  
  15. dt_folders.Columns.Add(port);  
  16. DataRow row;  
  17. while ((line = streamreader.ReadLine()) != null)  
  18. {  
  19.     row = dt_folders.NewRow();  
  20.     string[] readrow = line.Split(new char[] { '\t' });  
  21.     row["Name"] = readrow[0].ToString();  
  22.     row["Folder"] = readrow[1].ToString();  
  23.     row["UserName"] = readrow[2].ToString();  
  24.     row["Password"] = readrow[3].ToString();  
  25.     row["Protocol"] = readrow[4].ToString();  
  26.     row["Port"] = readrow[5].ToString();  
  27.     dt_folders.Rows.Add(row);  
  28.     listBox_folders.Items.Add(row["Name"]);  
  29. }  
  30. datatable_folders = dt_folders.Copy();  
最后是复制给一个全局变量供全局使用。

没有评论:

发表评论