Удалить строку из файла с
Мне нужно повторно удалить первую строку из огромного текстового файла с помощью скрипта bash.
сейчас я использую sed -i -e "1d" $FILE - но для удаления требуется около минуты.
есть ли более эффективный способ сделать это?
-n x : просто распечатайте последний x строки. tail -n 5 даст вам последние 5 строк ввода. The + знак вида инвертирует аргумент и делает tail печать ничего, кроме первого x-1 строки. tail -n +1 напечатал бы весь файл, tail -n +2 все, кроме первой строки, и т. д.
GNU tail гораздо быстрее, чем sed . tail также доступно на BSD и -n +2 флаг согласовано в обоих инструментах. Проверьте FreeBSD или OS X man-страницы для более.
версия BSD может быть намного медленнее, чем sed , хотя. Интересно, как им это удалось?--7--> надо просто читать файл построчно, пока sed выполняет довольно сложные операции, связанные с интерпретацией скрипта, применением регулярных выражений и тому подобное.
Примечание: у вас может возникнуть искушение использовать
но это даст вам пустой файл. Причина в том, что перенаправление ( > ) происходит перед tail вызывается оболочкой:
- оболочка усекает файл $FILE
- Shell создает новый процесс для tail
- Shell перенаправляет stdout
вы можете использовать-i для обновления файла без использования оператора'>'. Следующая команда удалит первую строку из файла и сохранит ее в файле.
для тех, кто находится на SunOS, который не является GNU, следующий код поможет:
нет, это примерно так же эффективно, как вы собираетесь получить. Вы можете написать программу на C, которая может выполнять работу немного быстрее (меньше времени запуска и обработки аргументов), но она, вероятно, будет стремиться к той же скорости, что и sed, поскольку файлы становятся большими (и я предполагаю, что они большие, если это займет минуту).
но ваш вопрос страдает от той же проблемы, что и многие другие, поскольку он заранее предполагает решение. Если бы вы рассказали нам подробно что вы пытаетесь делай, а не то как, мы можем предложить лучший вариант.
например, если это файл A, который обрабатывает другая программа B, одним из решений было бы не удалять первую строку, а изменять программу B для ее обработки по-другому.
предположим, что все ваши программы добавляются в этот файл A и программа B в настоящее время читает и обрабатывает первую строку перед ее удалением.
вы можете перепроектировать программу B, чтобы она не пыталась удалить первая строка, но поддерживает постоянное (возможно, файловое) смещение в файл A, чтобы при следующем запуске он мог искать это смещение, обрабатывать строку там и обновлять смещение.
затем, в спокойное время (полночь?), он может выполнить специальную обработку файла A, чтобы удалить все строки, обрабатываемые в настоящее время, и установить смещение обратно в 0.
Это, безусловно, будет быстрее для программы, чтобы открыть и искать файл, а не открывать и переписывать. Это обсуждение предполагает вас контролировать программу Б, конечно. Я не знаю, так ли это, но могут быть другие возможные решения, если вы предоставите дополнительную информацию.
вы can редактировать файлы на месте: просто используйте perl -i флаг, как это:
Это заставляет первую строку исчезнуть, как вы просите. Perl нужно будет прочитать и скопировать весь файл, но он организует для вывода, который будет сохранен под именем исходного файла.
Как сказал Пакс, вы, вероятно, не получите быстрее, чем это. Причина в том, что практически нет файловых систем, поддерживающих усечение с начала файла, поэтому это будет O ( n операции), где n размер файла. Что вы можете сделать много быстрее, хотя перезаписывает первую строку с тем же количеством байтов (возможно, с пробелами или комментарием), которые могут работать для вас в зависимости от того, что вы пытаетесь сделать (что это, кстати?).
Здравствуйте, меня интересует такой вопрос - как удалить определённую строку из файла, если я знаю
её номер ?
Удаление и редактирование определённой строки
Задание- словарь синонимов, в нём нужно осуществить удаление и редактирование определённой строки в.
Удаление из файла определенной записи
Новые записи сохраняются в файле нормально, а вот как удалить определённую запись не могу понять.
Удаление строки из файла\либо удаление самого файла.
День добрый, вот функция(используемые переменные объявленны ранее): void delete_cruise() < FILE.
Удаление определенной строки из Memo
Прювэд народ. Подскажите как из Memo удалять строки начинающиеся с определенного символа.
Нельзя просто из файла удалить строку (если она не последняя, иначе, точно не помню, вроде можно файл урезать), придется записывать в новый файл все, за исключением этой строки.
Одним из решений этой ситуации можно использовать построчное считывание данных из файла по строкам.
Вот краткий пример. (P.S я его не компилил, сейчас просто негде и поэтому возможны опечатки)
Я его не компилил , сейчас просто негде, пишу с планшета. Должно работать, хотя написанный код скорее всего не является оптимальным решением про производительности!
Решение
stawerfar, большое спасибо, сейчас буду тестить
Добавлено через 45 минут
stawerfar, всё очень хорошо работает . Эх. даже стыдно просить . можешь модифицировать свой код так, чтобы он не просто удалял строку, а и заменял её на ту, которую введет пользователь ?
У меня не получается, я вить только недавно начал программировать и не понимаю некоторые части кода.
file_out.write(line_file_text.c_str(), line_file_text.size());
file_out.clear();
А как можно сделать удаление, но не по номеру, а по содержимому?
Добавлено через 37 секунд
я просто написал программу, но результата нету
Удаление определенной строки из файла
Хаи гайсы. Объясняю ситуацию. У меня есть текстовый файл. При работе он будет большим, в ней.
Удаление определённой строки из .txt
Искал на форуме, так должного ответа и не нашёл. Как из .txt удалить определённую строку.
Удаление текста до определенной строки
Есть TextBox, который содержит в себе следующие данные: Сравнить Сравнить . Машина.
Удаление из строки определенной ее части
Всем привет! Подскажите пожалуйста, каким образом можно удалить из строки известную часть. вообще.
Необходимо удалить все элементы, у которых год выпуска меньше заданного.
Вот код: создаёт файл и мы записываем туда структуру, но мне надо потом ввести год и программа должна удалить все строки, у которых год выпуска меньше заданного. Как это сделать?
1) Открываем файл с записями (ф1) на чтение. 2) Открываем новый файл (ф2) на запись. 3) читаем по очереди записи из ф1, если запись удовлетворяет условию (например год больше заданного), записываем запись в ф2. 4) закрываем файлы и заменяем ф1 на ф2.
Отформатируйте как следует и хватит плодить одинаковые вопросы, вы там за всю группу задания постите что ли?
Вам уже объясняли основной алгоритм: 1) Открываем файл на чтение. 2) читаем по очереди строки из файла, если строка удовлетворяет условию, записываем её в во временную строковую переменную. 3) закрываем файл 4) открываем тот же файл на перезапись, записывам полученную в пункте 2 строку.
Ах да, самое главное забыл, вы хоть добавьте в описание вопроса разяснение проблемы, что именно в коде не работает? Ну или хотя бы опишите словами то, что код должен делать и вам быстро напишут какой-нибудь вариант решения (просто ваши вопросы очень размытые мягко говоря). И, все-таки, отформатируйте код в вопросе.
3 ответа 3
Как-то так, только проверьте, давно ничего не читал из файлов.
Точку с запятой расставили (я там пропустил в паре мест)? На какие скобки? Этот код должен быть внутри main, ну и Ваш outfile закрыть нужно сначала.
Ну, первая ошибка - комментарий начинается с // , а не \\ :)
А вторая и главная - вы объявили record.year как string , но сравниваете это поле с int . Что больше - "литр" или 15? - примерно так у вас получилось.
Это ответ на ваш конкретный вопрос, но это еще не все ошибки. Намекну, например, что при объявлении массива его размер должен быть известен при компиляции.
@Софья Ну я же указал вторую. третья - думаю, стоимость тоже не стоит делать строкой. Далее, если вы попробуете ввести как марку машины, например, Volkswagen Passat - как два слова - то второе слово окажется ценой. Думаю, пока хватит.
Начнем с мелочи - вы пишете в файл, открытый для чтения. Но это мелочь. Посмотрите сами, что делает ваша программа во второй части: считывает и выводит кучу записей из файла (надеюсь, что он есть и не пуст. ), затем пытается проверить последнюю (не помню уж, формально - не имеет ли права fread испортить память при ошибке чтения), и если она проходит условие - пытаетесь дописать ее в конец файла, открытого для чтения. "Где же логика?!" (с) Анекдот про Вовочку.
И еще - если вы так пишете код, не форматируя - вы мешаете сами себе. Поймите, всякие отступы и т.п. - это не придирки преподавателя. Согласитесь, что такой код, как показан ниже, гораздо проще понимать. А современные редакторы по сути сами его делают таким (вопрос скорее - как вам удается так его корежить?)
например я хочу удалить от туда запись Bobik или любую другую .
как можно сделать ? может сущетвует кой алгоритм удаления или надо мудрувать ?
Алгоритм зависит от того, по каким критериям ты будешь удалять запись: по номеру или по совпадению строк
Так что давай конкретнее
Алгоритм зависит от того, по каким критериям ты будешь удалять запись: по номеру или по совпадению строк
Так что давай конкретнее
впринцыпе все равно:p и вариант с удалением по сурагатному ключу или по совпаденю строк подходит
using namespace std;
int main()
ifstream in ("test.dat", ios::in);
ofstream out("test.new", ios::out);
char buff[256];
int num,i;
max_dark спасибо за код.
я наверлно не правильно обяснил, по номеру строки не подходит.
лучше уж по совпадению строки:)))
m_Valery Спасибо :)
с кодом разобрался, только не смог асилить что значит это:
Можешь вместо int _tmain(int argc, _TCHAR* argv[]) использовать
int main().int argc и _TCHAR* argv[]) - параметры командной строки. argc - количество параметров,argv - строки,представляющие отдельные значения. Смотри об этом подробнее в учебниках.В Visual Studio 2003,2005 используется int _tmain,в 6-й была просто main.
кстати а как вам такой вариант:
что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы.
там где F то значит что они "мертвые".
а там где T то значит что они "живые".
а в самой проге будет функция которая проверяет статусы и работает только с "живыми" пользователями . и функция по удалению, которая по сути статусы меняет на F
кстати а как вам такой вариант:
что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы.
там где F то значит что они "мертвые".
а там где T то значит что они "живые".
а в самой проге будет функция которая проверяет статусы и работает только с "живыми" пользователями . и функция по удалению, которая по сути статусы меняет на F
как такая идея, что скажите ?
main()
ofstream out("dogs.dat",ios::app);
char *name = new char[15];
char status;
в этом примере ты записываешь имя и статус, и читаешь имя и статус в отдельные переменные, и потом в цикле можешь сравнивать статус и вызывать функцию обработку с собаками
Можно функции read и write использовать, они записывают в файл структуры в текстовом виде, и соответственно могут удалять структуры
Помогите написать похожую прогу плз.
Программа должна удалять запись по совподению строк, но тока в файле в котором нужно удалить данные не один столбец, а 5.
Программа которая приведена в этой теме работает только если в файле один столбец.
Помогите написать похожую прогу плз.
Программа должна удалять запись по совподению строк, но тока в файле в котором нужно удалить данные не один столбец, а 5.
Программа которая приведена в этой теме работает только если в файле один столбец.
Построчно считываем файл в вектор.Вводим слово.которое хотим удалить,удаляем его и перезаписываем файл.Например так.
прочитайте файл, удалите строку в памяти и поместите содержимое обратно в файл (перезапись). Если файл большой, вы можете прочитать его строку за строкой и создать временный файл, позже заменив исходный.
на очень большие файлы, я бы сделал что-то вроде этого
обновление я изначально написал это еще в 2009 году и я думал, что это может быть интересно с обновлением. Сегодня вы можете выполнить вышеуказанное, используя LINQ и отложенное исполнение
код выше почти точно такой же, как в первом примере, читая строку за строкой и сохраняя минимальный объем данных в памяти.
A отказ от ответственности может быть в порядке. Поскольку мы говорим о текстовых файлах, вам очень редко придется использовать диск в качестве промежуточного носителя. Если вы не имеете дело с очень большими файлами журналов, не должно быть никаких проблем с чтением содержимого в память и избежать необходимости иметь дело с временным файлом.
отметим, что .ToList имеет решающее значение здесь, чтобы заставить немедленное исполнение. Также обратите внимание, что все примеры предполагают, что текстовые файлы кодируются UTF-8.
- читать весь файл в память (например, File.ReadAllLines )
- удалите оскорбительную строку (в этом случае, вероятно, проще всего преобразовать массив строк в List затем удалить строку)
- напишите все остальные строки назад (например, с File.WriteAllLines ) - потенциально преобразовать List в массив строк снова с помощью ToArray
это означает, что вы должны знать, что у вас есть достаточно памяти, хотя. Альтернатива:
- Откройте как входной файл, так и новый выходной файл (как TextReader / TextWriter , например, File.OpenText и File.CreateText )
- читать строки ( TextReader.ReadLine ) - если вы не хотите удалять его, напишите в выходной файл ( TextWriter.WriteLine )
- когда вы прочитаете все строки, закройте как считыватель, так и писатель (Если вы используете using заявления для обоих, это произойдет автоматически)
- если вы хотите заменить вход на выход, удалите входной файл, а затем переместите выходной файл на место.
я расширил то, что предложил Маркус Олссон, и придумал этот класс, который добавляет несколько строк поиска и пару событий:
чтобы удалить элемент из текстового файла, сначала переместите весь текст в список и удалите нужный элемент. Затем запишите текст, хранящийся в списке, в текстовый файл
Я бы очень просто:
- открыть файл для чтения/записи
- читать / искать через него до начала строки, которую вы хотите удалить
- установите указатель записи на текущий указатель чтения
- прочитайте до конца строки, которую мы удаляем, и пропустите разделители новой строки (считая количество символов, когда мы идем, мы назовем его nline)
- читать байт за байтом и записывать каждый байт в файл
- когда закончите усечь файл до (orig_length-nline).
Привет, ребята, я написал метод удаления строк из файлов. Эта программа использует using System.IO
Читайте также: