public static void open(ListView listView1)
        {
            OpenFileDialog _open = new OpenFileDialog();
            _open.Filter = "(文本文件)|*.NC";
            _open.InitialDirectory = System.AppDomain.CurrentDomain.BaseDirectory;
            _open.FileName = "";
            if (_open.ShowDialog() == DialogResult.OK)
            {
                StreamReader sr = new StreamReader(_open.FileName, Encoding.Default);
                String tempstr;
                ListViewItem templist;
                Match matchN;  //编号正则
                Match matchG;  //刀状态正则
                Match matchX;  //X坐标正则
                Match matchY;  //Y坐标正则
                Match matchZ;  //刀高度正则
                while ((tempstr = sr.ReadLine()) != null)
                {
                    try
                    {
                        matchN = Regex.Match(tempstr, @"N\d+");
                        matchG = Regex.Match(tempstr, @"G\d+");
                        matchX = Regex.Match(tempstr, @"X\d+\W\d+");
                        matchY = Regex.Match(tempstr, @"Y\d+\W\d+");
                        matchZ = Regex.Match(tempstr, @"Z\W?\d+\W\d+");
                        templist = listView1.Items.Add(matchN.Value);
                        templist.SubItems.Add(matchG.Value);
                        templist.SubItems.Add(matchX.Value);
                        templist.SubItems.Add(matchY.Value);
                        templist.SubItems.Add(matchZ.Value);
                    }
                    catch (Exception ex) { MessageBox.Show(ex.Message); }
                }
            }
        }
NC是本文文件,这种文件很大,小的也有2M以上,大的甚至有G的级别!
现在要读取每一行然后分成5份,添加进listView1控件,速度很慢,读取2M的也要几分钟,以后大的文件基本就读不了了!有什么好的办法吗?

解决方案 »

  1.   

    while ((tempstr = sr.ReadLine()) != null)
                    {
                        try
                        {
                            //tempmatch = Regex.Match(tempstr, @"N\d+");
                            templist = listView1.Items.Add(tempstr);
                            //tempmatch = Regex.Match(tempstr, @"G\d+");
                            //templist.SubItems.Add(tempmatch.Value);
                            //tempmatch = Regex.Match(tempstr, @"X\d+\W\d+");
                            //templist.SubItems.Add(tempmatch.Value);
                            //tempmatch = Regex.Match(tempstr, @"Y\d+\W\d+");
                            //templist.SubItems.Add(tempmatch.Value);
                            //tempmatch = Regex.Match(tempstr, @"Z\W?\d+\W\d+");
                            //templist.SubItems.Add(tempmatch.Value);
                        }
                        catch (Exception ex) { MessageBox.Show(ex.Message); }
                    }
    即使这样了也还是很慢……
      

  2.   

    2M的数据你即使不处理直接赋值到ListView也会有不短的延时的.
    如果非得这样做,建议你用异步处理,每处理N条数据就触发一次数据处理的事件,让主线程把处理结果添加到ListView.但这样做意义不是很大,因为不到数据处理完显示出来的数据是不完整的.
    另一个方法就是用Regex.Matches()方法,一次匹配,能省一点点时间.
      

  3.   

    为什么必须要一次性处理完?
    listView1有必要一次性创建完吗?
    要查看?搜索?好像都没必要一次都处理完么可以写到一个List<String>里去,这个是很快的,然后在这个list做需要遍历整个结果的操作,但如果要绘制到控件就很慢了你这么多数据,即使加上beginupdate endupdatelistview可以用虚拟列表达到不全部显示,需要的时候才去读进来ListView.VirtualMode
    http://msdn.microsoft.com/zh-cn/asp.net/system.windows.forms.listview.virtualmode.aspx大体上就是
    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();        }        ListViewItem[] Cache;
            int firstItem; 
            StreamReader SR = null;
                
            void button1_Click(object sender, EventArgs e)
            {
                SR = new StreamReader(@"e:\20061206163528649.exe");
                
                listView1.VirtualMode = true;
                listView1.VirtualListSize = 100;
            
                listView1.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView1_RetrieveVirtualItem);
                listView1.CacheVirtualItems += new CacheVirtualItemsEventHandler(listView1_CacheVirtualItems);        }        void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
            {
                if (Cache != null && e.ItemIndex >= firstItem && e.ItemIndex < firstItem + Cache.Length)
                {
                    e.Item = Cache[e.ItemIndex - firstItem];
                }
                else
                {
                    int x = e.ItemIndex * e.ItemIndex;
                    e.Item = new ListViewItem(x.ToString());
                }
            }        void listView1_CacheVirtualItems(object sender, CacheVirtualItemsEventArgs e)
            {
                if (Cache != null && e.StartIndex >= firstItem && e.EndIndex <= firstItem + Cache.Length)
                {
                    return;
                }            firstItem = e.StartIndex;
                int length = e.EndIndex - e.StartIndex + 1;
                Cache = new ListViewItem[length];            for (int i = 0; i < length; i++)
                {
                    Cache[i] =new ListViewItem ( SR.ReadLine()); 
                }        }    }
      

  4.   

    已解决,直接 listView1.VirtualMode = false;就可以了,谢谢,结贴