偶们给人做数值计算程序,需要读入一些文本文件.txt或者.dat
里面数据有的是以“空格”分开,有的是以“tab”分开,有的是以“,”分开,而且每行的数据数量不一致,有的多,有的少,有没有好的办法,区分开这三类分隔符的一行数据,如下数据:
12.00
1.000, 2.000, 2.0000 4.5555
4.555另外,数据文件的长短不确定,不知道有多少行,采用arraylist 是否是最好的办法?
里面数据有的是以“空格”分开,有的是以“tab”分开,有的是以“,”分开,而且每行的数据数量不一致,有的多,有的少,有没有好的办法,区分开这三类分隔符的一行数据,如下数据:
12.00
1.000, 2.000, 2.0000 4.5555
4.555另外,数据文件的长短不确定,不知道有多少行,采用arraylist 是否是最好的办法?
class Program
{
static void Main()
{
//这里我用StringReader做示例,读文件传入StreamReader,他们都是TextReader
using (StringReader sr = new StringReader("1.2 1.3 , 1.4\t \r\n 1.5 , \n 1.6 \t , 1.7"))
{
foreach(double d in new MyFilter(sr,'\t',' ','\n','\r', ',').Collect())
Console.WriteLine(d);
}
} } class MyFilter
{
readonly char[] spaces;
TextReader tr; public MyFilter(TextReader tr, params char[] spaces)
{
if (tr == null || spaces == null)
throw new ArgumentNullException();
this.tr = tr;
this.spaces = spaces;
} public double[] Collect()
{
List<double> @return = new List<double>();
StringBuilder sb = new StringBuilder();
char c;
while (tr.Peek() != -1)
{
c = (char)tr.Read();
if (Array.IndexOf<char>(spaces, c) >= 0)
{
if (sb.ToString() != String.Empty)
{
@return.Add(Convert.ToDouble(sb.ToString()));
sb = new StringBuilder();
}
continue;
}
sb.Append(c);
}
if (sb.ToString() != String.Empty)
{
@return.Add(Convert.ToDouble(sb.ToString()));
sb = new StringBuilder();
}
return @return.ToArray();
}
}