C# 分析带有空格的文本行

C# 分析带有空格的文本行,c#,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 .3

我有一个文件,文本格式如下:

  .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 ;
    }
请注意,在一个值和另一个值之间有许多白色字符

我试着读每一行,然后根据“”字符分割这一行。我的代码是这样的:

  .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 ;
    }
上述代码的问题在于,它只能处理值由单个白色字符分隔的情况


有什么想法吗?

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


我个人也会直接调用ReadLine,直到返回null,而不是使用TextReader.Peek。除此之外,它更通用—即使底层流(如果有)不支持查找,它也可以工作。

在执行拆分之前,请将所有多个空间替换为单个空间,例如:

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

您可以为此使用简单的单行代码。让您的文本位于名为input的字符串中

string[] values = System.Text.RegularExpressions.Regex.Split(input, @"\s+");
您只需简单地获取字符串数组中的所有值