Войти

Показать полную графическую версию : Удалить первые/последние N символов каждой строки


Asdshka
03-01-2023, 19:24
Приветствую, помогите пожалуйста сделать BAT скрипт, который удаляет первые N символов каждой строки текстового файла
И второй скрипт, который удаляет последние N символов каждой строки текстового файла

Почему решил BAT, потому что файл больше 100МБ, плюсы и шарп долго очень обрабатывают и кушают ОЗУ

DJ Mogarych
03-01-2023, 20:31
Powershell

$n = 6

# первые
(gc "C:\temp\Untitled 1.txt") -replace "^.{$n}" > "C:\temp\Untitled 2.txt"

# последние
(gc "C:\temp\Untitled 1.txt") -replace ".{$n}$" > "C:\temp\Untitled 2.txt"

Asdshka
03-01-2023, 20:57
Powershell »
Благодарю, но мне бы лучше батник.

Проверил сейчас ваш код, работает медленно, к сожалению.
Но меня очень удивило то, что исходный файл 10МБ, а на выходе (без 2 первых символов) 10МБ. Как такое возможно?) Кодировка?

NickM
03-01-2023, 21:10
работает медленно, к сожалению. »
Происходит запись на носитель;

что исходный файл 10МБ, а на выходе (без 2 первых символов) 10МБ. Как такое возможно?) »
А что именно не так?
2 символа - 2 байта.

YuS_2
04-01-2023, 10:47
мне бы лучше батник. »
Лучше чем, что?

Проверил сейчас ваш код, работает медленно, к сожалению. »
И Вы думаете, что батник победит все рекорды скорости? :)

скрипт, который удаляет первые N символов каждой строки текстового файла »
$fin = 'test.txt'
$fout = 'out.txt'
$n = 2
$pattern = "^.{$n}"

$reader = [io.streamreader]::new($fin)
$writer = [io.streamwriter]::new($fout)
while ($reader.peek() -ne -1) {
$writer.writeline($reader.readline() -replace $pattern)
}
$reader.dispose();$reader.close()
$writer.dispose();$writer.close()

Результат работы с файлом, размером 127Mb:
TotalSeconds : 8,0404748

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

Asdshka
04-01-2023, 20:45
А что именно не так? »
Я опечатался. Исходная 10МБ, а на выходе 19МБ

И Вы думаете, что батник победит все рекорды скорости? »
Нет, просто для меня это было бы очень удобно, но и за этот вариант огромное спасибо

А подскажите, пожалуйста, какой $pattern использовать для того, чтобы был не номер символа, а конкретный символ.
Например до символа "@" и после символа "@"

YuS_2
05-01-2023, 07:35
до символа "@" »
"^.+(?=@)"
после символа "@" »
"(?<=@).+$"

DJ Mogarych
05-01-2023, 14:32
Если разделитель @ не нужен

("etete@ututu.fi") -replace '@.+'
etete
("etete@ututu.fi") -replace '.+@'
ututu.fi




© OSzone.net 2001-2012