2010-09-03 65 views
2

我有一個文件解析文本行,文本格式是這樣的:與空的空間

.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 ; 
    } 

與上面的代碼的問題是,它是唯一能夠處理,其中值由單一的白色字符分隔的情況。

有什麼想法?

回答

4

最簡單的方法可能是使用String.Split的過載,其中包含StringSplitOptions參數,並指定StringSplitOptions.RemoveEmptyEntries

我個人也只是打電話ReadLine,直到返回null,而不是使用TextReader.Peek。除了其他任何東西之外,它更普遍 - 即使底層流(如果有)不支持搜索,它也可以工作。

1

之前你做的分裂,用一個空格替換所有的多空間,像:

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

您可以使用簡單的一行代碼這一點。讓您的文本位於名爲input的字符串中。

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

你會得到一個字符串數組的所有值只是