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的也要几分钟,以后大的文件基本就读不了了!有什么好的办法吗?
{
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的也要几分钟,以后大的文件基本就读不了了!有什么好的办法吗?
{
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); }
}
即使这样了也还是很慢……
如果非得这样做,建议你用异步处理,每处理N条数据就触发一次数据处理的事件,让主线程把处理结果添加到ListView.但这样做意义不是很大,因为不到数据处理完显示出来的数据是不完整的.
另一个方法就是用Regex.Matches()方法,一次匹配,能省一点点时间.
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());
} } }