Показать полную графическую версию : Удалить иероглифы
Здравствуйте, есть большой файл (построчный). Где-то в середине могут попадаться всякие иероглифы или эмодзи. Как сделать так, чтобы кроме символов, цифр и спецсимволов в файле ничего не осталось?
Foreigner
10-02-2023, 23:13
А где кусочек файла?
Примерно так. Но не точно:
"Thats a nice, joke ������ ��? Yes!" -replace '(?<=\s|^)\W+?(?=\s|$)'
PS. Смайлики исчезли.
А где кусочек файла? »
Ну примерно такие строки в файле: "1.txt"
5�ἱﺖخGρ慭εο�γλﮢل▒ύO�οςφ慭óO¶Ã���D��4
Нужно, чтобы кроме кириллицы, латиницы, арабских цифр и спецсимволов обычных ничего не осталось:
ёйцукенгшщзхъфывапролджэячсмитьбю
ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ
qwertyuiopasdfghjjklzxcvbnm
QWERTYUIOPASDFGHJKLZXCVBNMM
1234567890
!@#$%^&*()_+-=/;:'"\|,./<>?`~[]{}
Foreigner
11-02-2023, 13:32
Нужно, чтобы кроме кириллицы, латиницы, арабских цифр и спецсимволов обычных ничего не осталось »
Попробуйте, правда не уверен на счет производительности. Но в принципе это возможно оптимизировать
Powershell:
$str = [char[]](Get-Content 1.txt | Out-String)
$chars = [char[]]("ёйцукенгшщзхъфывапролджэячсмитьб" + `
"юЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБ" + `
"ЮqwertyuiopasdfghjjklzxcvbnmQWER" + `
"TYUIOPASDFGHJKLZXCVBNMM123456789" + `
"0!@#$%^&*()_+-=/;:'`"``\|,./<>?~[]{}`n`r`t ")
-join ($str | ? { $_ -in $chars }) | Set-Content 2.txt
ёйцукенгшщзхъфывапролджэячсмитьбю
ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ
qwertyuiopasdfghjjklzxcvbnm
QWERTYUIOPASDFGHJKLZXCVBNMM
1234567890
!@#$%^&*()_+-=/;:'"\|,./<>?`~[]{} »
$file = '.\1.txt'
$out = 'out.txt'
(gc $file -enc utf8) -replace '[^-a-zа-яё\d!@#$%^&*()_+=/;:"\\|,./<>?`~\[\]{}\x27 ]'|out-file $out -enc utf8
DJ Mogarych
11-02-2023, 14:35
$from = "C:\temp\test.txt"
$to = "C:\temp\result.txt"
$chars = [char[]](33..126+1040..1103+1025+1105)
$result = foreach ($str in (gc $from)) {
-join (($str).ToCharArray() |% {if ($_ -in $chars) {$_}})
}
$result |Out-File $to -Encoding utf8
Можно сделать отбор символов поизящнее, например, по категориям: https://lazywinadmin.com/2015/08/powershell-remove-special-characters.html
Foreigner
11-02-2023, 14:48
С replace в 28 раз быстрее. на 10K строк (из примера) 1 сек против 28.
А если мне нужно удалить ещё и просто спецсимволы, но после первого знака ":" или ";"
То есть строки могут быть
ads/ghvj:adg23@14hjbkn
ads/ghvj;adg23@14hjbkn
-replace '(?<=[^:;]+)[^-a-zа-яё\d!@#$%^&*()_+=/;:"\\|,./<>?`~\[\]{}\x27 ]' »
Немного не то, надо удалить спецсимволы после разделителя, а разделитель либо ":" либо ";", могут оба присутствовать
Foreigner
11-02-2023, 22:19
Asdshka, Я ошибся и удалил сообщение. Тут придется не весь текст "махом" обрабатывать, а построчно, что дольше, как-то так (не тестировал):
$content =
foreach ($line in (Get-Content file.txt))
{
$a, $b = $line -split '(?<=[^:;]+[:;])(?=.+)'
-join ($a, $($b -replace '[^-a-zа-яё\d!@#$%^&*()_+=/;:"\\|,./<>?`~\[\]{}\x27 ]'))
}
Set-Content out.txt $content
есть большой файл »
Тогда вопрос: насколько большой?
надо удалить спецсимволы после разделителя »
Вы тогда настройтесь, сконцентрируйтесь и составьте полные условия задачи в целом...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.