У меня есть небольшая проблема. У меня есть .csv со значениями «NaN» и удваивается (например, 0,6034), и я пытаюсь прочитать только двойные значения CSV в массив [y] [x].

В настоящее время я прочитал весь CSV, но я не могу удалить все значения "NaN" впоследствии. (Он должен разобрать CSV и просто добавить Numbers в массив [y] [x] и оставить все «NaN» вне)

Мой текущий код:

 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 имеет около 60.000 значений ... Мне нужно получить входные данные с [y] [x], например, [0] [0] должно отображать «1» и [2] [ 1] должно отображать «7» и так далее.

Еще раз спасибо за вашу помощь!

3
christian890 25 Апр 2017 в 09:21

2 ответа

Лучший ответ

Если вы хотите удалить все строки, содержащие 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);

Изменить . Проблема заключается в том, чтобы брать 2-й и 3-й полные столбцы только из 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

Желаемый результат

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

Реализация:

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();
1
Dmitry Bychenko 25 Апр 2017 в 08:53

Вы можете сделать фильтр ваших значений с разделителями в массиве.

Я немного изменил твой код.

 File.ReadAllLines(filepath).Select(l => l.Split(';').ToArray().Where(y => y != "NaN").ToArray()).ToArray();
6
scartag 25 Апр 2017 в 06:41