Vbs удалить строку из текстового файла

Обновлено: 04.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 заявления для обоих, это произойдет автоматически)
  • если вы хотите заменить вход на выход, удалите входной файл, а затем переместите выходной файл на место.

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

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

Есть три способа создания пустого текстового файла (иногда называемого как «text stream»).

Первый способ — это использование метода CreateTextFile. В следующем примере показано, как создать текстовый файл, используя этот метод: Пример использования данного метода см. в разделе «3.7. Пример работы с объектом FileSystemObject».

Второй способ — это использование метода OpenTextFile объекта FileSystemObject с набором флагов ForWriting. В следующем примере показано, как создать текстовый файл, используя этот метод: Третий способ — это использование метода OpenAsTextStream с набором флагов ForWriting. В следующем примере показано, как создать текстовый файл, используя этот метод:

Добавление данных в файл

  • Открыть текстовый файл
  • Записать данные
  • Закрыть файл

Для записи данных в текстовый файл используйте методы Write, WriteLine или WriteBlankLines объекта TextStream, в зависимости от задач, описанных в приведённой ниже таблице:

Задача Метод
Запись данных в текстовый файл без символа перехода на новую строку в конце Write
Запись данных в текстовый файл с символом перехода на новую строку в конце WriteLine
Запись одной или более пустых строк в открытый текстовый файл WriteBlankLines

Для закрытия текстового файла используйте метод Close объекта TextStream. Закрыть файл можно также методом Close объекта FileSystemObject. Пример использования данных методов см. в разделе «3.7. Пример работы с объектом FileSystemObject».

ПРИМЕЧАНИЕ
Символ новой строки содержит символ или символы (зависит от операционной системы) для перевода курсора в начало новой строки (возврат каретки/перевод строки). Следует учитывать, что некоторые строки уже могут иметь в конце эти непечатаемые символы.

В следующем примере показано, как выполняется запись данных в открытый файл всеми тремя методами, затем файл закрывается:

Чтение файлов

Для чтения данных из файла используйте методы Read, ReadLine или ReadAll объекта TextStream. Эти методы и задачи, решаемые с их помощью, описаны в приведённой ниже таблице:

Задача Метод
Чтение указанного количества символов из файла Read
Чтение полной строки из файла (до символа конца строки, но не включая его) ReadLine
Чтение всего содержимого файла ReadAll

Пример использования данных методов см. в разделе «3.7. Пример работы с объектом FileSystemObject».

Если вы используете методы Read или ReadLine и хотите пропустить определённую часть данных, то используйте методы Scip или ScipLine. Полученный в результате работы этих методов текст может быть сохранён в строку, которую можно отобразить на экране в элементе управления, передать в качестве параметра в строковую функцию (например, в Left, Right или Mid), соединить с другой строкой и т.п.

В следующем примере показано, как открыть файл, записать в него данные, а затем прочитать их:

Перемещение, копирование и удаление файлов

Объектная модель FSO имеет для каждой из операций перемещения, копирования или удаления файлов по два метода. Эти методы и задачи, решаемые с их помощью, описаны в приведённой ниже таблице:

Задача Метод
Перемещение файла File.Move или FileSystemObject.MoveFile
Копирование файла File.Copy или FileSystemObject.CopyFile
Удаление файла File.Delete или FileSystemObject.DeleteFile

Пример использования данных методов см. в разделе «3.7. Пример работы с объектом FileSystemObject».

В следующем примере создаётся текстовый файл в корневом каталоге диска С, записывается в него некоторая информация. Затем файл перемещается в директорию с именем \tmp, копируется в директорию \temp, а затем удаляются копии из обеих директорий.

Для проверки работы этого примера создайте в корневом каталоге диска С директории tmp и temp.

Мне нужно повторно удалить первую строку из огромного текстового файла с помощью скрипта 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 вызывается оболочкой:

  1. оболочка усекает файл $FILE
  2. Shell создает новый процесс для tail
  3. Shell перенаправляет stdout

вы можете использовать-i для обновления файла без использования оператора'>'. Следующая команда удалит первую строку из файла и сохранит ее в файле.

для тех, кто находится на SunOS, который не является GNU, следующий код поможет:

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

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

например, если это файл A, который обрабатывает другая программа B, одним из решений было бы не удалять первую строку, а изменять программу B для ее обработки по-другому.

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

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

затем, в спокойное время (полночь?), он может выполнить специальную обработку файла A, чтобы удалить все строки, обрабатываемые в настоящее время, и установить смещение обратно в 0.

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

вы can редактировать файлы на месте: просто используйте perl -i флаг, как это:

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

Как сказал Пакс, вы, вероятно, не получите быстрее, чем это. Причина в том, что практически нет файловых систем, поддерживающих усечение с начала файла, поэтому это будет O ( n операции), где n размер файла. Что вы можете сделать много быстрее, хотя перезаписывает первую строку с тем же количеством байтов (возможно, с пробелами или комментарием), которые могут работать для вас в зависимости от того, что вы пытаетесь сделать (что это, кстати?).

каждый день мы получаем плоский текстовый файл. Несколько дней в файле есть строки, которые необходимо удалить, прежде чем его можно будет обработать. Эти линии могут появляться в разных местах, но всегда начинаются с символов 6999 или 7999. Мы хотели бы запустить скрипт, который будет удалять эти строки. Однако, и это далеко за пределами меня, где есть строка, которая начинается с 6999, будет строка непосредственно перед ней, которая начинается с 5442, которая также должна быть удалена, но только если она сразу появляется перед строкой 6999.

мы Магазин Windows и будет запускать этот скрипт как часть простого пакетного файла в Windows. Мы не используем Unix или Linux и не желаем этого.

расширение имени файла содержит дату. сегодняшняя файла.100621, завтра будет файл.100622. У меня проблемы с этим аспектом, так как кажется, что VBScript не любит файл.*

вот пример текстового файла:

мы хотели бы удалить 5 строки в этом файле (строка 5442, три строки 6999 и строка 7999).

вот пример скрипта, который я нашел на этом сайте, изменил и имел некоторый успех, но не знаю, как удалить строки (только знаю, как заменить данные в строке). Я понимаю, что это либо потребует серьезных изменений, либо нужно будет вообще выбросить, но я публикую это, чтобы дать представление о том, что, я думаю, мы ищем. Я поместил это в каталог с cscript.exe и назвать его из простого пакетного файла:

что получает меня это:

закрыть! просто нужно удалить строки вместо того, чтобы писать "удалить строку". Так вот мои конкретные потребности, основанные на том, что я знаю:

  1. получить скрипт для обработки любого файла в каталоге (и будет только 1 за раз, но расширение меняется каждый день)
  2. получить сценарий для удаления любой строки, которая начинается с 5442, непосредственно перед строкой, которая начинается 6999
  3. сделать скрипт, чтобы полностью удалить те строки, которые начинаются с и 6999 7999

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

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

Я думаю, что это сработает (но я не так хорош в VBS, поэтому никаких обещаний):

обратите внимание, что я думаю, что вы проверяли, содержат ли строки цифры в любом месте, но вы сказали, что правило, если они начинаются с чисел, вот почему я делаю <> 1 , а не > 0 .

Это будет мой псевдо-алгоритм для решения этой проблемы:

(Я скорее научу вас своим мыслям о том, как я бы его решил, чем предоставлю сам код)

сделать простой файл "config" для этой программы тоже. Каждая строка может представлять собой "фильтр", а затем вы можете добавить действия к строкам, если это необходимо.

как в [pattern] [action]

файл обработки " XXXXXXXXX.log " (или любое другое имя) Загрузите все строки, если их не слишком много или readline, чтобы захватить один (в зависимости от производительности и использования памяти)

для каждой строки возьмите первые 4 буквы из строки.

теперь нам понадобится строка для разбора:

поскольку нам нужны только первые 4 символа, чтобы решить, нужно ли нам его сохранить.

Если это " sLine" (строка) находится в нашем массиве фильтров/шаблонов, тогда у нас есть совпадение. сделайте то, что мы настроили (в вашей текущей настройке - удалить = игнорировать строку).

6b. Если нет совпадения в массиве шаблонов, то у нас есть линия для хранения. Запишите это в выходной поток.

закрыть вход и выход файл.

Это не просто чистый VBSCRIPT, но идея алгоритма ann для любого языка.

Я надеюсь, что вы можете увидеть мою идею в нем, иначе вы просто прокомментируете ее, и я попытаюсь развить ее. Надеюсь, я дал вам отличный ответ.

OK, вот окончательный сценарий, как awesomely собранный Tester101. Этот скрипт удаляет строки, которые не нужны, как описано выше. Он также имеет дело с линиями, которые находятся в конце каждой строки (без моего ведома)

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