Как удалить строки из IEnumerable - PullRequest
0 голосов
/ 04 июля 2018

Я загружаю файлы CSV в IEnumerable.

  string[] fileNames = Directory.GetFiles(@"read\", "*.csv");
  for (int i = 0; i < fileNames.Length; i++)
  { 
       string file = @"read\" + Path.GetFileName(fileNames[i]);
       var lines   = from rawLine in File.ReadLines(file, Encoding.Default)
                     where !string.IsNullOrEmpty(rawLine) 
                     select rawLine;
  }

После этого я работаю с данными, но теперь есть несколько файлов, которые почти пустые и имеют только ";;;;;;" (сумма варьируется) написано там.

Как я могу удалить эти строки перед тем, как работать с ними и ничего не менять в файлах csv?

Ответы [ 5 ]

0 голосов
/ 04 июля 2018

В качестве другого варианта чтения CSV-файла можно использовать класс TextFieldParser . Он имеет CommentTokens и Delimiters, которые могут вам помочь в этом.

Определение ; в качестве CommentTokens может вам помочь.

Учебник

0 голосов
/ 04 июля 2018

Если количество ; символов в строке является переменным, это то, как должно выглядеть ваше условие "где":

where !string.IsNullOrEmpty(rawLine) && !string.IsNullOrEmpty(rawLine.Trim(';'))

rawLine.Trim(';') вернет копию строки со всеми удаленными ; символами. Если эта новая строка пуста, это означает, что эту строку можно игнорировать, поскольку она содержит только ; символов.

0 голосов
/ 04 июля 2018

Вы не можете ничего удалить из IEnumerable (например, из List<T>), но вы можете добавить фильтр:

lines = lines.Where(l => !l.Trim().All(c => c == ';'));

Это ничего не удалит, но вы больше не будете обрабатывать эти строки.

0 голосов
/ 04 июля 2018

Есть несколько решений.

  1. Преобразуйте перечислимое в список, затем удалите из списка. Это немного дороже.

  2. Создать одну функцию. // Вы можете применить несколько фильтров в случае необходимости.

    public IEnumrable<string> GetData(ref IEnumrable<string> data)
    {
          return data.Where(c=> !String.Equals(c,"<<data that you want to filter>>");  
    }
    
0 голосов
/ 04 июля 2018

Невозможно удалить строки из перечислимого - https://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx.

Вместо этого попробуйте создать новый массив с отфильтрованными данными или отфильтруйте его в предложении where, которое вы представили как:

string[] fileNames = Directory.GetFiles(@"read\", "*.csv");
         for (int i = 0; i < fileNames.Length; i++)
            { string file = @"read\" + Path.GetFileName(fileNames[i]);
var lines = from rawLine in File.ReadLines(file, Encoding.Default) where !string.IsNullOrEmpty(rawLine) && rawLine != ";;;;;;" select rawLine;}
...