Vbs удалить строку из текстового файла
прочитайте файл, удалите строку в памяти и поместите содержимое обратно в файл (перезапись). Если файл большой, вы можете прочитать его строку за строкой и создать временный файл, позже заменив исходный.
на очень большие файлы, я бы сделал что-то вроде этого
обновление я изначально написал это еще в 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 вызывается оболочкой:
- оболочка усекает файл $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 размер файла. Что вы можете сделать много быстрее, хотя перезаписывает первую строку с тем же количеством байтов (возможно, с пробелами или комментарием), которые могут работать для вас в зависимости от того, что вы пытаетесь сделать (что это, кстати?).
каждый день мы получаем плоский текстовый файл. Несколько дней в файле есть строки, которые необходимо удалить, прежде чем его можно будет обработать. Эти линии могут появляться в разных местах, но всегда начинаются с символов 6999 или 7999. Мы хотели бы запустить скрипт, который будет удалять эти строки. Однако, и это далеко за пределами меня, где есть строка, которая начинается с 6999, будет строка непосредственно перед ней, которая начинается с 5442, которая также должна быть удалена, но только если она сразу появляется перед строкой 6999.
мы Магазин Windows и будет запускать этот скрипт как часть простого пакетного файла в Windows. Мы не используем Unix или Linux и не желаем этого.
расширение имени файла содержит дату. сегодняшняя файла.100621, завтра будет файл.100622. У меня проблемы с этим аспектом, так как кажется, что VBScript не любит файл.*
вот пример текстового файла:
мы хотели бы удалить 5 строки в этом файле (строка 5442, три строки 6999 и строка 7999).
вот пример скрипта, который я нашел на этом сайте, изменил и имел некоторый успех, но не знаю, как удалить строки (только знаю, как заменить данные в строке). Я понимаю, что это либо потребует серьезных изменений, либо нужно будет вообще выбросить, но я публикую это, чтобы дать представление о том, что, я думаю, мы ищем. Я поместил это в каталог с cscript.exe и назвать его из простого пакетного файла:
что получает меня это:
закрыть! просто нужно удалить строки вместо того, чтобы писать "удалить строку". Так вот мои конкретные потребности, основанные на том, что я знаю:
- получить скрипт для обработки любого файла в каталоге (и будет только 1 за раз, но расширение меняется каждый день)
- получить сценарий для удаления любой строки, которая начинается с 5442, непосредственно перед строкой, которая начинается 6999
- сделать скрипт, чтобы полностью удалить те строки, которые начинаются с и 6999 7999
я внес некоторые изменения, чтобы попытаться устранить пустую строку, я также добавил функцию для цикла через выходной файл и удалить любые пустые строки. Надеюсь, это сработает.
использовать его вызывать ее из командной строки одним из двух способов.
Я думаю, что это сработает (но я не так хорош в VBS, поэтому никаких обещаний):
обратите внимание, что я думаю, что вы проверяли, содержат ли строки цифры в любом месте, но вы сказали, что правило, если они начинаются с чисел, вот почему я делаю <> 1 , а не > 0 .
Это будет мой псевдо-алгоритм для решения этой проблемы:
(Я скорее научу вас своим мыслям о том, как я бы его решил, чем предоставлю сам код)
сделать простой файл "config" для этой программы тоже. Каждая строка может представлять собой "фильтр", а затем вы можете добавить действия к строкам, если это необходимо.
как в [pattern] [action]
файл обработки " XXXXXXXXX.log " (или любое другое имя) Загрузите все строки, если их не слишком много или readline, чтобы захватить один (в зависимости от производительности и использования памяти)
для каждой строки возьмите первые 4 буквы из строки.
теперь нам понадобится строка для разбора:
поскольку нам нужны только первые 4 символа, чтобы решить, нужно ли нам его сохранить.
Если это " sLine" (строка) находится в нашем массиве фильтров/шаблонов, тогда у нас есть совпадение. сделайте то, что мы настроили (в вашей текущей настройке - удалить = игнорировать строку).
6b. Если нет совпадения в массиве шаблонов, то у нас есть линия для хранения. Запишите это в выходной поток.
закрыть вход и выход файл.
Это не просто чистый VBSCRIPT, но идея алгоритма ann для любого языка.
Я надеюсь, что вы можете увидеть мою идею в нем, иначе вы просто прокомментируете ее, и я попытаюсь развить ее. Надеюсь, я дал вам отличный ответ.
OK, вот окончательный сценарий, как awesomely собранный Tester101. Этот скрипт удаляет строки, которые не нужны, как описано выше. Он также имеет дело с линиями, которые находятся в конце каждой строки (без моего ведома)
Читайте также: