Удалить все строки из файла

Обновлено: 05.07.2024

прочитайте файл, удалите строку в памяти и поместите содержимое обратно в файл (перезапись). Если файл большой, вы можете прочитать его строку за строкой и создать временный файл, позже заменив исходный.

на очень большие файлы, я бы сделал что-то вроде этого

обновление я изначально написал это еще в 2009 году и я думал, что это может быть интересно с обновлением. Сегодня вы можете выполнить вышеуказанное, используя LINQ и отложенное исполнение

код выше почти точно такой же, как в первом примере, читая строку за строкой и сохраняя минимальный объем данных в памяти.

A отказ от ответственности может быть в порядке. Поскольку мы говорим о текстовых файлах, вам очень редко придется использовать диск в качестве промежуточного носителя. Если вы не имеете дело с очень большими файлами журналов, не должно быть никаких проблем с чтением содержимого в память и избежать необходимости иметь дело с временным файлом.

отметим, что .ToList имеет решающее значение здесь, чтобы заставить немедленное исполнение. Также обратите внимание, что все примеры предполагают, что текстовые файлы кодируются UTF-8.

  • читать весь файл в память (например, File.ReadAllLines )
  • удалите оскорбительную строку (в этом случае, вероятно, проще всего преобразовать массив строк в List<string> затем удалить строку)
  • напишите все остальные строки назад (например, с File.WriteAllLines ) - потенциально преобразовать List<string> в массив строк снова с помощью ToArray

это означает, что вы должны знать, что у вас есть достаточно памяти, хотя. Альтернатива:

  • Откройте как входной файл, так и новый выходной файл (как TextReader / TextWriter , например, File.OpenText и File.CreateText )
  • читать строки ( TextReader.ReadLine ) - если вы не хотите удалять его, напишите в выходной файл ( TextWriter.WriteLine )
  • когда вы прочитаете все строки, закройте как считыватель, так и писатель (Если вы используете using заявления для обоих, это произойдет автоматически)
  • если вы хотите заменить вход на выход, удалите входной файл, а затем переместите выходной файл на место.

я расширил то, что предложил Маркус Олссон, и придумал этот класс, который добавляет несколько строк поиска и пару событий:

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

Сейчас я делаю это, используя что-то вроде этого, чтобы удалить все строки в файле:

Как я могу удалить все строки, используя vi ?

Примечание: использование dd не является хорошим вариантом. Там может быть много строк.

@MadTux, только если вы начинаете с первой строки. 1GdG будет работать из любого места. echo | test.txt не является допустимой командой, если test.txt это не исполняемый скрипт. Я предполагаю, что вы имеете в виду echo >test.txt вместо этого? Обратите внимание, что не используя vi , >test.txt достаточно обрезать его до нулевой длины - не echo нужно.

удалить все строки.

: Вводит команду (и перемещает курсор вниз).
Это 1,$ указание того, над какими строками d должна работать следующая команда ( ). В этом случае диапазон от первой строки до последней строки (обозначен $ , так что вам не нужно знать количество строк в документе).
Финал d обозначает удаление указанных строк.

Существует более короткая форма ( :%d ), но я никогда не использую ее. Это :1,$d может быть легче "приспособлено", например, :4,$-2d оставить только первые 3 и последние 2 строки, удалив остальные.

Про совет. Не более ESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd.

В vi я использую

  • : говорит vi перейти в командный режим
  • % означает все строки
  • d : удалять

В командной строке

будет делать также.

В чем проблема с дд?

  • /dev/null специальный 0-байтовый файл
  • if это входной файл
  • of это выходной файл
Я думал, что используя dd мне нужно Pess для каждой строки в файле. Вы должны различать dd команду vi (которую имел в виду OP) и dd утилиту, которую вы приводите в качестве примера. Кроме того, > test.txt может не работать должным образом в оболочках, отличных от bash (например, zsh).

Я бы порекомендовал вам просто сделать это (должно работать в любой POSIX-совместимой оболочке):

Если вы действительно хотите сделать это с помощью vi, вы можете сделать:

  • 1G (перейти к первой строке)
  • dG (удалить до последней строки)
G представляет последнюю строку. Если вы находитесь на первой строке ( gg ), dG указывает vi удалить все строки из текущей строки (первой строки) до последней строки. Итак, вы делаете это в один выстрел. gg является специфическим для vim. Это 1G в традиционном vi. Ваш синтаксис оболочки зависит от конфигурации некоторых оболочек. Интерактивные оболочки bash и zsh (по умолчанию zsh) могут ожидать ввода в STDIN после получения этой команды, и для фактической очистки файла требуется дополнительная клавиша <CTRL> + D. Возможность запуска также зависит от настроек CLOBBER. >| test.txt < /dev/null является несколько более надежным, поскольку он всегда будет загромождать файл и избегать ожидания ввода на интерактивных терминалах. @Caleb: Как я уже говорил, в любой POSIX-совместимой оболочке. :-) Ни одна из этих двух ситуаций не является жалобой POSIX.

Если ваш курсор находится на первой строке (если нет, введите: gg или 1G ), то вы можете просто использовать dG . Это удалит все строки от текущей строки до конца файла. Поэтому, чтобы убедиться, что вы удалите все строки из файла, вы можете смешать обе вместе, что будет: ggdG (в командном режиме).

Или %d в режиме Ex, пример командной строки: vim +%d foo.bar .

+1 за эргономичность: 1, $ d. Не то чтобы наши пальцы не были настроены на то, чтобы все время печатать двоеточие; во всяком случае;) Я считаю, что это ( ggdG ) самый простой метод в Vim. Причина, по которой этот ответ не одобряется как другие, заключается в том, что gg в чистом vi его нет?

Я ленивый чувак, и мне нравится быть простым. ggdG пять нажатий клавиш в том числе Shift

gg идет к первой строке в файле, d является началом d глагола elete и G является движением, чтобы перейти к нижней части файла. Более подробно, это перейти в начало файла и удалить все до конца плитки.

РВКР. Я тоже ленивый и использую :$d или :1,$d это более быстрый способ (я пишу меньше символов) kkk :%d Хорошая альтернатива, так как вы также используете только 5 нажатий клавиш.

Перейти к началу файла и нажмите d G .

Я всегда использую ggVG

  • gg переходит к началу текущего файла редактирования
  • V (с заглавной буквы v) выберет текущую строку. В этом случае первая строка текущего файла редактирования
  • G (с заглавной буквы g) перейдет к концу файла. В этом случае, поскольку я выбрал первую строку, G выделю весь текст в этом файле.

Затем вы можете просто нажать d или, x чтобы удалить все строки.

Если вы используете d вертикально, он автоматически применяется аналогично. dl удаляет символ справа, dj удаляет, например, строку вниз.

обратите внимание, что в вашем вопросе echo > test.txt создается файл с одним разрывом строки, а не пустой файл.

Из оболочки рассмотрите возможность использования echo -n > test.txt или : > test.txt .

Хотя я обычно использую команду редактирования vi (я использую ggdG ), вы также можете вызвать оболочку со ссылкой на текущий файл, например, так:

Это почти так же кратко, как ggdG , но сложнее набрать, и вы также должны подтвердить, что вы хотите перезагрузить измененный файл, поэтому я не особенно рекомендую его в этом случае, но знать, как использовать команды оболочки из vi, как это полезно.

Я хочу, чтобы вывод выглядел так: каждая вторая строка будет удалена, но между строками не будет пропуска.

Вы хотите удалить каждую вторую строку или все строки, которые содержат «Ошибка не возникла» ? Что, если в двух последовательных строках было написано «Нет ошибки» ? @ user1598390 Я думаю . в этом случае grep -v "No error occurred" file эта команда должна работать . на что ответил @paul. В выходном файле не будет строк, содержащих «Нет ошибок».

Если у вас есть старше awk (как oawk ), вам нужно:

отредактируем файл на месте.

  • g пометить глобальную команду
  • /$/ соответствовать каждой линии
  • +d удалить следующую строку
  • wq! сохранить все изменения

Этот подход разделяет тот же идеал с sed подходом, удаляя каждую следующую строку текущей строки, начиная со строки 1.

Да . он работает . :) . первый работает . я тоже пробовал второй . он говорит `awk: синтаксическая ошибка line1 awk: вылетает около строки 1 '

Да, работает @cuonglm .

Я предполагаю, что вы использовали n\;d вместо того, 'n;d' чтобы сохранить драгоценный символ, но эта логика выходит за рамки, когда вы без необходимости используете -e переключатель и перенаправление файлов < ! @ Geek: Это просто более короткая версия sed -e 'n;d' , за исключением одного персонажа. @Geek: n команда записать пространство шаблона в стандартный вывод, если он -n был использован, а затем заменить пространство шаблона следующей строкой. Здесь каждая нечетная строка будет напечатана n , четная строка затем будет считана в пространство шаблона, но немедленно d удалена командой`.

Решение этой проблемы путем удаления каждой второй строки может привести к ошибкам (например, когда процесс иногда генерирует две значащие строки вместо одной). Может быть, лучше отфильтровать мусор

Он может работать как фильтр, вы можете добавить больше шаблонов мусора и улучшить результат.

+1 за указание на то, что иногда важна вторая строка!

В связи с вопросом, с GNU sed :

удалит каждую вторую строку, но я бы хотел предложить строки фильтра по содержанию:

Необходимо удалить все элементы, у которых год выпуска меньше заданного.

Вот код: создаёт файл и мы записываем туда структуру, но мне надо потом ввести год и программа должна удалить все строки, у которых год выпуска меньше заданного. Как это сделать?


183k 13 13 золотых знаков 103 103 серебряных знака 208 208 бронзовых знаков 1) Открываем файл с записями (ф1) на чтение. 2) Открываем новый файл (ф2) на запись. 3) читаем по очереди записи из ф1, если запись удовлетворяет условию (например год больше заданного), записываем запись в ф2. 4) закрываем файлы и заменяем ф1 на ф2. Если вам дан исчерпывающий ответ, отметьте его как верный (галка напротив выбранного ответа). Отформатируйте как следует и хватит плодить одинаковые вопросы, вы там за всю группу задания постите что ли? Вам уже объясняли основной алгоритм: 1) Открываем файл на чтение. 2) читаем по очереди строки из файла, если строка удовлетворяет условию, записываем её в во временную строковую переменную. 3) закрываем файл 4) открываем тот же файл на перезапись, записывам полученную в пункте 2 строку. Ах да, самое главное забыл, вы хоть добавьте в описание вопроса разяснение проблемы, что именно в коде не работает? Ну или хотя бы опишите словами то, что код должен делать и вам быстро напишут какой-нибудь вариант решения (просто ваши вопросы очень размытые мягко говоря). И, все-таки, отформатируйте код в вопросе.

Как-то так, только проверьте, давно ничего не читал из файлов.

7,266 10 10 серебряных знаков 29 29 бронзовых знаков Точку с запятой расставили (я там пропустил в паре мест)? На какие скобки? Этот код должен быть внутри main, ну и Ваш outfile закрыть нужно сначала.

Ну, первая ошибка - комментарий начинается с // , а не \\ :)

А вторая и главная - вы объявили record.year как string , но сравниваете это поле с int . Что больше - "литр" или 15? - примерно так у вас получилось.

Это ответ на ваш конкретный вопрос, но это еще не все ошибки. Намекну, например, что при объявлении массива его размер должен быть известен при компиляции.


183k 13 13 золотых знаков 103 103 серебряных знака 208 208 бронзовых знаков @Софья Ну я же указал вторую. третья - думаю, стоимость тоже не стоит делать строкой. Далее, если вы попробуете ввести как марку машины, например, Volkswagen Passat - как два слова - то второе слово окажется ценой. Думаю, пока хватит.

Начнем с мелочи - вы пишете в файл, открытый для чтения. Но это мелочь. Посмотрите сами, что делает ваша программа во второй части: считывает и выводит кучу записей из файла (надеюсь, что он есть и не пуст. ), затем пытается проверить последнюю (не помню уж, формально - не имеет ли права fread испортить память при ошибке чтения), и если она проходит условие - пытаетесь дописать ее в конец файла, открытого для чтения. "Где же логика?!" (с) Анекдот про Вовочку.

И еще - если вы так пишете код, не форматируя - вы мешаете сами себе. Поймите, всякие отступы и т.п. - это не придирки преподавателя. Согласитесь, что такой код, как показан ниже, гораздо проще понимать. А современные редакторы по сути сами его делают таким (вопрос скорее - как вам удается так его корежить?)

И еще - это вот, несмотря на применение cin - никак не С++.


183k 13 13 золотых знаков 103 103 серебряных знака 208 208 бронзовых знаков

Читайте также: