【C#】读取txt、csv等二维表

来源:互联网 发布:mysql的sequence 编辑:程序博客网 时间:2024/06/05 17:44

程序要读文件,在实战中主要还是以二维表为主,类似下图这种:


基本上除了掌握《【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经过这个程序,运行结果如下所示:


1 0
原创粉丝点击