程序要读文件,在实战中主要还是以二维表为主,类似下图这种:
基本上除了掌握《【C#】txt的读写》(点击打开链接)的文件流的读写,还需要与《【C#】利用正则表达式判断输入是否为纯数字、容器类》(点击打开链接)灵活运用。本文将使用《【Java】一行代码读完记事本中的二维表》(点击打开链接)的思想,展示在C#如何读取这个的二维表,读入到Listview当中。
首先是场景布置,没什么好说的,这也不是本文的重点,就在Form中一个Button一个修改了部分属性的Listview。
主要是如下的双击Button1生成的点击事件,Form1.cs如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace read_txtTable
{
public partial class Form1 : Form
{
char SPLIT_SEPARATOR = ' ';//存放二维表文件的csv或者txt的分隔符
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int line_max_count = 0;//计算这个二维表的列最多去到多少
List<List<String>> T = new List<List<String>>();//用于存二维表的容器,就是一个存List的List
OpenFileDialog openFileDialog1 = new System.Windows.Forms.OpenFileDialog();//一个打开文件的对话框
openFileDialog1.Filter = "文本文件(*.txt)|*.txt";//设置允许打开的扩展名,你也可以改成csv之类的
if (openFileDialog1.ShowDialog() == DialogResult.OK)//判断是否选择了文件
{
StreamReader streamReader = new StreamReader(openFileDialog1.FileName, Encoding.Default);//读取文件的流
while (!streamReader.EndOfStream)//如果没读到最后
{
List<String> line = new List<String>(streamReader.ReadLine().Split(SPLIT_SEPARATOR));//每一行根据分隔符形成数组,同时形成List
T.Add(line);//T增加这一行
if (line_max_count < line.Count)//此乃求列的最大值算法
{
line_max_count = line.Count;
}
}
streamReader.Close();
}
//设置listview的表头
for (int i = 0; i < line_max_count; i++)
{
listView1.Columns.Add("列" + (i + 1), listView1.Width / line_max_count - 1, HorizontalAlignment.Left);
}
listView1.BeginUpdate();//数据更新,UI暂时挂起,直到EndUpdate绘制控件,可以有效避免闪烁并大大提高加载速度
for (int i = 0; i < T.Count; i++)
{
List<String> line = T[i];
ListViewItem listViewItem = new ListViewItem();
for (int j = 0; j < line.Count; j++)
{
if (j == 0)
{
listViewItem.Text = line[j];//listview的每一行的第一项
}
else
{
listViewItem.SubItems.Add(line[j]);//其余子项
}
}
listView1.Items.Add(listViewItem);//将这行添加到listview中
}
listView1.EndUpdate();//结束数据处理,UI界面一次性绘制。
}
}
}
你甚至还可以设置一个textBox让用户输入分隔符,不过这样读取二维表的算法一般是自用的。ListView的使用在《【C#】ListView的使用,对Access数据库的增删改查》( 点击打开链接)详细说过,这里不再赘述了。主要大家要记住,针对这样的二维表,基本上是设置一个存List的List。因为文件流的读取基本上一行一行地进行,所以在读取的过程中,将一行行用Split('分隔符')的方式,并通过new List()将其打成一个数组,再形成List。同时值得注意的是,C#的Split只能接受char,Java则能接受string和char。
最后上述的txt经过这个程序,运行结果如下所示: