PDA

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


Asdshka
10-02-2023, 16:20
Здравствуйте, есть большой файл (построчный). Где-то в середине могут попадаться всякие иероглифы или эмодзи. Как сделать так, чтобы кроме символов, цифр и спецсимволов в файле ничего не осталось?

Foreigner
10-02-2023, 23:13
А где кусочек файла?

Примерно так. Но не точно:

"Thats a nice, joke ������ ��? Yes!" -replace '(?<=\s|^)\W+?(?=\s|$)'


PS. Смайлики исчезли.

Asdshka
11-02-2023, 11:49
А где кусочек файла? »
Ну примерно такие строки в файле: "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

YuS_2
11-02-2023, 14:13
ёйцукенгшщзхъфывапролджэячсмитьбю
ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ
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.

Asdshka
11-02-2023, 20:24
А если мне нужно удалить ещё и просто спецсимволы, но после первого знака ":" или ";"
То есть строки могут быть
ads/ghvj:adg23@14hjbkn
ads/ghvj;adg23@14hjbkn

Asdshka
11-02-2023, 22:00
-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

YuS_2
12-02-2023, 08:11
есть большой файл »
Тогда вопрос: насколько большой?
надо удалить спецсимволы после разделителя »
Вы тогда настройтесь, сконцентрируйтесь и составьте полные условия задачи в целом...




© OSzone.net 2001-2012