问题描述
privatevoidbutton1_Click(objectsender,EventArgse){OpenFileDialogofd=newOpenFileDialog();ofd.Filter="(*.*)|*.*";ofd.RestoreDirectory=true;if(ofd.ShowDialog()==DialogResult.OK){textBox6.Text=ofd.FileName;FileStreamfs=newFileStream(ofd.FileName,FileMode.Open,FileAccess.Read);StreamReadersr=newStreamReader(fs);try{ofd.OpenFile();stringline=sr.ReadLine();while(line!=null){textBox3.Text+=line+"n";line=sr.ReadLine();}}catch(Exceptionex){MessageBox.Show(ex.Message.ToString());}finally{sr.Close();fs.Close();}}}现在这个代码我打开了一个txt文件,并把它完全读出来了,全放在了textbox3里,现在我打开的这个文档里的字符串内容都是如下的,大概1000多个下面这样的字符串,怎么改红色的代码,给这些字符串分割出来(我现在读出来的是全部的,但是这里有好多没用的数据,我要写的文件只取我想要的数据),让我重新写一个文件.是不是while判断里需要该一下?$aaa,3603.0134,N,12017.8616,E,000.1,269.4,2,000.1,1,1,325.3,2,0,02.3,202,02.4,167,02.0,167,02.2,(没用的)(这个有用)$aaa,3603.0128,N,12017.8613,E,000.1,269.4,2,000.1,1,1,325.3,2,0,02.0,191,02.1,156,02.1,160,02.2,
解决方案
解决方案二:
看你读完之后又拼接,那你完全没必要一行行读取啊,直接sr.ReadToEnd()方法将整个txt内容读取出来不就行了至于后面的有用没用看不懂……
解决方案三:
我现在这个思路不知道对不对?我先stringline=sr.ReadLine();(这个是不是读取了全部数据?我是不是应该只读取第一行的数据,然后做个循环?)stringa=line.substring(0,5);给a赋值取第一行的前5个字符?stringb=line.substring(6.10);给b赋值取第一行的第6到第10个字符?然后写文件的时候给a,b....XXX写到一起重新生成?
解决方案四:
$aaa,3603.0134,N,12017.8616,E,000.1,269.4,2,000.1,1,1,325.3,2,0,02.3,202,02.4,167,02.0,167,02.2,(没用的)(这个有用)$aaa这几个字符,我不取,就是没用的意思000.1这几个字符我要用,怎么取出来?是不是得判断这一行总的长度的,然后再取位置?
解决方案五:
按逗号切割line,000.1在下标5处
解决方案六:
如果你这样子的话,一行行读取是对的然后看你没用的前面有5个逗号,然后后面我也不了解你要取几个数据那你可以通过正则来匹配^(?:[^,]*,){5}([^,]*,){3}红色部分代表到E位置正好有5个逗号,后面就看你要几个了数字了,如果你要后面所有的话,那你可以将蓝色部分改成.*$
解决方案七:
能不用正则的吗?就是先定义str.length,然后通过substring提取的?正则的,我有点看不懂
解决方案八:
"(没用的)(这个有用)"你自己知道,别人可能理解有误,你将那串字符串中有用的,也就是你要取出的用其他颜色标出来。
解决方案九:
你都没有明确的规则,怎么筛选数据???
解决方案十:
正则只是简单点,不用正则,你就要循环判断,的indexstringstr=@"";intcount=0;intindex=0;while(true){index=str.IndexOf(str,index);if(index>=0){count++;if(count>=5){//这时候对应的index就是你那个0.1前面一个逗号的index了break;}}}
解决方案十一:
引用1楼starfd的回复:
看你读完之后又拼接,那你完全没必要一行行读取啊,直接sr.ReadToEnd()方法将整个txt内容读取出来不就行了至于后面的有用没用看不懂……
好像是用逗号分割
解决方案十二:
本帖最后由 starfd 于 2015-09-15 12:46:13 编辑
解决方案十三:
IndexOf第一个参数应该是逗号,你这个的确有规则啊绿色部分就是字符串啊……对应你读取出来的每行字符串其实还是正则更简单……
解决方案十四:
textBox3.Text+=string.Join(",",line.Split(',').Where((p,i)=>i==5||i==11));
解决方案十五:
我贴出来的代码部分如何只读取第一行,并开始分析?我现在代码是全部读出来放到textBox3里去了,怎么只读第一行,然后给他做个循环。
解决方案:
有后续处理为何要用textbox,richtextbox或listbox不是更好richtextbox:foreach(stringsinrichtextbox.Lines){//....}
解决方案:
可通过richtextbox.Lines按索引取,或遍历。
解决方案:
引用12楼starfd的回复:
IndexOf第一个参数应该是逗号,你这个的确有规则啊绿色部分就是字符串啊……对应你读取出来的每行字符串其实还是正则更简单……
stringstr=@"";intcount=0;intindex=0;while(true){index=str.IndexOf(str,index);if(index>=0){count++;if(count>=5){//这时候对应的index就是你那个0.1前面一个逗号的index了break;}如何给红色部分,直接锁定到打开的第一行文本?
解决方案:
这个就是你的line
解决方案:
这样是否可行呢?stringstr=@"";//我打开的txt文本的第一行;string[]dt=line.Split(newchar[]{','},StringSplitOptions.RemoveEmptyEntries);然后再写入新文件的时候直接取dt[6]
解决方案:
stringstr="$aaa,3603.0134,N,12017.8616,E,000.1,269.4,2,000.1,1,1,325.3,2,0,02.3,202,02.4,167,02.0,167,02.2,"string[]bit=str.Split(',');stringno1=bit[5].ToString();//你要的stringno2=bit[11].ToString();//你要的
解决方案:
不错,感谢楼主分享!!
解决方案:
不错哦,有助于刚入手的新手学习,谢谢分享哦