var [] []数组删除特定的单词

时间:2017-04-25 06:21:48

标签: c# arrays csv remove-if

我有点问题。我有一个.csv与" NaN"值和双精度(例如0.6034),我试图将CSV的双精度数据读入数组[y] [x]。

目前,我读了整个.csv,但我无法删除所有" NaN"之后的价值观。 (它应解析CSV并将数字添加到数组[y] [x]并保留所有" NaN" out)

我目前的代码:

 var rows = File.ReadAllLines(filepath).Select(l => l.Split(';').ToArray()).ToArray(); //reads WHOLE .CSV to array[][]


        int max_Rows = 0, j, rank;
        int max_Col = 0;
        foreach (Array anArray in rows)
        {
            rank = anArray.Rank;
            if (rank > 1)
            {
                 // show the lengths of each dimension
                for (j = 0; j < rank; j++)
                {

                }
            }
            else
            {

            }
            // show the total length of the entire array or all dimensions

            max_Col = anArray.Length; //displays columns
            max_Rows++;  //displays rows
        }

我尝试了搜索,但无法找到任何对我有帮助的东西。 我知道这可能很容易,但我是C#的新手。

.CSV和期望的结果:

NaN;NaN;NaN;NaN
NaN;1;5;NaN
NaN;2;6;NaN
NaN;3;7;NaN
NaN;4;8;NaN
NaN;NaN;NaN;NaN

这是我的样本.csv。我应该更清楚,对不起!每一行都有一个NaN。我希望它显示如下:

1;5
2;6
3;7
4;8

这只是.csv的一个示例真正的csv有arround 60.000值......我需要用[y] [x]得到输入,例如[0] [0]应该显示&#34; 1& #34;并且[2] [1]应该显示&#34; 7&#34;等等。

再次感谢您的帮助!

2 个答案:

答案 0 :(得分:6)

您可以对数组中的分隔值进行过滤。

我稍微修改了你的代码。

 File.ReadAllLines(filepath).Select(l => l.Split(';').ToArray().Where(y => y != "NaN").ToArray()).ToArray();

答案 1 :(得分:1)

如果您要删除包含NAN的所有行(CSV的典型任务 - 清除所有不完整的行),例如

  123.0; 456; 789
    2.1; NAN;  35     <- this line should be removed (has NaN value)
     -5;   3;  18

你可以像这样实现它

  double[][] data = File
    .ReadLines(filepath)
    .Select(line => line.Split(new char[] {';', '\t'},
                               StringSplitOptions.RemoveEmptyEntries))
    .Where(items => items  // Filter first...
       .All(item => !string.Equals("NAN", item, StringComparison.OrdinalIgnoreCase)))
    .Select(items => items
       .Select(item => double.Parse(item, CultureInfo.InvariantCulture))
       .ToArray()) // ... materialize at the very end
    .ToArray();

使用string.Join显示行:

 string report = string.Join(Environment.NewLine, data
   .Select(line => string.Join(";", line)));

 Console.Write(report);

修改:实际问题是仅从CSV中获取第2和第3完整列:

NaN;NaN;NaN;NaN
NaN;1;5;NaN
NaN;2;6;NaN
NaN;3;7;NaN
NaN;4;8;NaN
NaN;NaN;NaN;NaN

期望的结果是

[[1, 5], [2, 6], [3, 7], [4, 8]]

implmentation:

double[][] data = File
  .ReadLines(filepath)
  .Select(line => line
     .Split(new char[] {';'},
            StringSplitOptions.RemoveEmptyEntries)
     .Skip(1) 
     .Take(2)
     .Where(item => !string.Equals("NAN", item, StringComparison.OrdinalIgnoreCase))
     .ToArray())
  .Where(items => items.Length == 2)
  .Select(items => items
    .Select(item => double.Parse(item, CultureInfo.InvariantCulture))
    .ToArray())
  .ToArray();

测试

// 1
Console.Write(data[0][0]);
// 5
Console.Write(data[0][1]);
// 2
Console.Write(data[1][0]);

一次性所有值:

string report = string.Join(Environment.NewLine, data
   .Select(line => string.Join(";", line)));

Console.Write(report);

结果:

1;5
2;6
3;7
4;8 

编辑2 :如果您只想提取非NaN值(请注意,初始CSV结构将毁了):

1;2;3              1;2;3
NAN;4;5            4;5   <- please, notice that the structure is lost
6;NAN;7        ->  6;7
8;9;NAN;           8;9
NAN;10;NAN         10
NAN;NAN;11         11 

然后

double[][] data = File
  .ReadLines(filepath)
  .Select(line => line
     .Split(new char[] {';'},
            StringSplitOptions.RemoveEmptyEntries)
     .Where(item => !string.Equals("NAN", item, StringComparison.OrdinalIgnoreCase)))
  .Where(items => items.Any()) 
  .Select(items => items
    .Select(item => double.Parse(item, CultureInfo.InvariantCulture))
    .ToArray())
  .ToArray();