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

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


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值