解析文本行与空白空间

时间:2010-09-03 09:03:24

标签: c#

我有一个文件,文本格式是这样的:

  .640      .070     -.390     -.740    -1.030    -1.410    -1.780    -1.840
-1.360     -.360      .860     1.880     2.340     2.250     1.950     1.710
 1.410      .700     -.300     -.840     -.280     1.020     1.860     1.460
  .310     -.460     -.320      .350     1.020     1.650     2.430     3.070
 2.840     1.440     -.460    -1.650    -1.520     -.520      .250      .190
 -.420     -.870     -.800     -.280      .570     1.660     2.500     2.220
  .520    -1.560    -2.530    -2.030    -1.200    -1.060    -1.230     -.600
  .990     2.300     2.180      .940     -.090     -.140      .320      .470
  .330      .420      .830     1.080     1.090     1.530     2.740     3.800
 3.410     1.610     -.150     -.900    -1.120    -1.640    -2.140    -1.590
  .210     2.210     3.290     3.170     2.380     1.880     2.530     4.210
 5.280     3.820     -.040    -3.670    -4.190    -1.260     2.930     5.740
 5.980     3.920      .540    -2.890    -5.010    -4.780    -2.150     1.640
 4.670     5.540     4.230     1.950      .120     -.470     -.010      .340
 -.710    -2.940    -4.070    -1.810     3.000     6.590     6.140     2.750
 -.490    -2.460    -4.180    -5.660    -4.800     -.560     4.510     6.630
 5.140     2.860     2.230     2.510     1.670     -.440    -2.030    -2.330

请注意,一个值与另一个值之间存在大量白色字符。

我尝试读取每一行,然后根据' '字符拆分该行。我的代码是这样的:

    public List<double> Parse(StreamReader sr)
    {
        var dataList = new List<double>();

        while (sr.Peek() >= 0)
        {

            string line = sr.ReadLine();
            if (lineCount > 1)
            {

                string[] columns = line.Split(' ');
                for (var j = 0; j < columns.Length; j++)
                {

                    dataList.Add(double.Parse(columns[j]) ));
                }
            }


        }
        return dataList ;
    }

上述代码的问题在于它只能处理值由单个白色字符分隔的情况。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

最简单的方法可能是使用包含StringSplitOptions参数的String.Split重载,并指定StringSplitOptions.RemoveEmptyEntries

我个人也会直接调用ReadLine,直到返回null,而不是使用TextReader.Peek。除了其他任何东西,它更通用 - 即使底层流(如果有的话)不支持搜索,它也会起作用。

答案 1 :(得分:1)

在进行拆分之前,请用一个空格替换所有多个空格,例如:

line = System.Text.RegularExpressions.Regex.Replace(line, @"  +", @" ");

答案 2 :(得分:0)

您可以使用简单的一行代码。让你的文本在名为input的字符串中。

string[] values = System.Text.RegularExpressions.Regex.Split(input, @"\s+");

您将获得字符串数组中的所有值