2015-04-21 3 views
-3

Я 150,000 строка текстового файла, который хранится в виде массива строк, как, например:Удаление значений из массива строк?

String[] OutputArray = File.ReadAllLines(TB_Complete.Text); 

Как я могу удалить заданный список строк из OutputArray? Или еще лучше, как я мог удалить первые 1000 строк OutputArray?

* EDIT: Мне нужны первые 1000 строк, которые нужно читать, анализировать, выводить в другой текстовый файл, а затем удалять. Извините, я не уточнил.

+1

Не прочитав эти первые 1000 строк в первую очередь – Alex

+0

Вам действительно нужно прочитать 150k строк в массиве? Это, как правило, очень плохая идея, например, для 'foreach (var line в File.ReadLines (путь) .Skip (1000)) {...}', который будет передавать данные без загрузки всего сразу? –

+1

Вы должны подумать об использовании 'List ' вместо этого. его гораздо проще использовать для массивов imo. –

ответ

4

Вместо этого я бы использовал ReadLines(), так как он возвращает IEnumerable<string>, а затем пропустит первые 1000 строк.

String[] OutputArray = File.ReadLines(TB_Complete.Text).Skip(1000).ToArray(); 
+4

@Alex это не делает; 'ReadLines' не буферизирован –

+0

oops, моя ошибка, я прочитал это как содержащее« ReadAllLines ». – Alex

+0

Он не выделяет 2 x 150 000 строк, кроме одного. Но все же вопрос заключается в том, действительно ли ОП это необходимо? –

-1

«Как удалить указанный список строк из OutputArray?»

var removeTheseLines= new string[5]; 
var lines = new string[10]; 

var filterLines = lines.Except(removeTheseLines).ToArray(); 
+1

Я подозреваю, что мы можем предположить, что «первые 1000 строк» ​​означают: пропускать 1000 строк - не «игнорировать все случаи того, что происходит в первых 1000 строках»; Я не думаю, что «Except» - хороший вариант здесь –

+0

Жаль, что я не указал. Мне нужно, чтобы первые 1000 строк читались, разбирались, выводились в другой текстовый файл, а затем удалялись. –

+0

@Marc Gravell: TBH, судя по редакциям плаката, я не уверен, что кто-то знает, что требуется. Я отказываюсь от этого. – Ulric

0

На самом деле ваша проблема заключается в том, чтобы удалить элемент массива из массива, и this поста может быть полезным, хотя и не эффективен в вашем случае.

У вас есть возможность использовать более подходящую структуру данных? Например, LIST<T>? Удаление элементов легко и очень эффективно в списках.

+1

Исключение из начала списка: * не * эффективный - * вообще *; вам все равно нужно сделать копию копии оставшихся данных. И даже это предполагает, что вы используете «RemoveRange», а не индивидуальное удаление, что было бы катастрофически плохо. Использование 'List ' достигает очень мало массивов - это не волшебная пуля. Не поймите меня неправильно - я вполне мог бы использовать 'List ' здесь; но это не будет то, что изменяет его от трудно-легко. –

+0

@MarcGravell Я согласен, я не сказал, что это просто или что 'List ' это волшебная пуля. Я знаю, что метод remove - это операция O (n), но в этой конкретной задаче с этими конкретными номерами (150 000 элементов с 1000 удалением) я полагаю, что производительность не является такой большой проблемой. Кроме того, «RemoveRange» не является плохим подходом, поскольку копия памяти иногда является «лучшим» решением ...; | –

2

Похоже, вам нужны первые 1000 строк, чтобы сделать что-то одно, а оставшиеся строки сделать что-то еще; Я бы попробовать и сделать это без накладных расходов на проведение все в памяти, так как насчет:

int index = 0; 
foreach(var line in File.ReadLines(path)) { 
    if(index++ < 1000) { 
     // this is one of the first 1000 lines; 
     DoA(line); 
    } else { 
     // this is one of the other lines 
     DoB(line); 
    } 
} 
+0

Из дополнительной информации, предоставленной оператором op, похоже, что основная проблема заключается в загрузке 150k строк текста сразу, поэтому это определенно предпочтительный ответ на эту конкретную проблему. – christophano

0
  1. Читать весь файл в
  2. Вытяните копию 1-ой 1000 линий
  3. Анализировать/обрабатывать эти 1000 строк
  4. Удалите 1000 строк из исходного массива
  5. Напишите свой файл обратно (я предполагаю, что, когда вы сказали, удалите их)

    List<string> outputArray = File.ReadAllLines(filePath).ToList(); 
        List<string> first1000Lines = outputArray.Take(1000).ToList(); 
    
        // Do what you need to do with first1000Lines 
    
        outputArray.RemoveRange(0, 1000); 
    
        File.WriteAllLines(filePath, outputArray); 
    

Вместо RemoveRange, вы можете также использовать Скипа.

File.WriteAllLines(filePath, outputArray.Skip(1000)); 
+0

Спасибо за ваш ответ! Я попытаюсь посмотреть, как я могу реализовать это в своем коде. Вот точный код, который я пытаюсь упростить. http://stackoverflow.com/questions/29779836/comparing-2-text-files-and-outputting-to-3rd-text-file-need-code-revision-co –

+0

Добро пожаловать ... Если это не что вы ищете, дайте больше разъяснений в своем вопросе. – Shar1er80

Смежные вопросы