Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Удалить иероглифы (http://forum.oszone.net/showthread.php?t=353025)

Asdshka 10-02-2023 16:20 3002855

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

Foreigner 10-02-2023 23:13 3002875

А где кусочек файла?

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

"Thats a nice, joke ������ ��? Yes!" -replace '(?<=\s|^)\W+?(?=\s|$)'
PS. Смайлики исчезли.

Asdshka 11-02-2023 11:49 3002895

Цитата:

Цитата Foreigner
А где кусочек файла? »

Ну примерно такие строки в файле: "1.txt"
Цитата:

5�ἱﺖخGρ慭εο�γλﮢل▒ύO�οςφ慭óO¶Ã���D��4
Нужно, чтобы кроме кириллицы, латиницы, арабских цифр и спецсимволов обычных ничего не осталось:
Цитата:

ёйцукенгшщзхъфывапролджэячсмитьбю
ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ
qwertyuiopasdfghjjklzxcvbnm
QWERTYUIOPASDFGHJKLZXCVBNMM
1234567890
!@#$%^&*()_+-=/;:'"\|,./<>?`~[]{}

Foreigner 11-02-2023 13:32 3002907

Цитата:

Цитата Asdshka
Нужно, чтобы кроме кириллицы, латиницы, арабских цифр и спецсимволов обычных ничего не осталось »

Попробуйте, правда не уверен на счет производительности. Но в принципе это возможно оптимизировать

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 3002915

Цитата:

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

Код:

$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/pow...haracters.html

Foreigner 11-02-2023 14:48 3002918

С replace в 28 раз быстрее. на 10K строк (из примера) 1 сек против 28.

Asdshka 11-02-2023 20:24 3002938

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

Asdshka 11-02-2023 22:00 3002949

Цитата:

Цитата Foreigner
-replace '(?<=[^:;]+)[^-a-zа-яё\d!@#$%^&*()_+=/;:"\\|,./<>?`~\[\]{}\x27 ]' »

Немного не то, надо удалить спецсимволы после разделителя, а разделитель либо ":" либо ";", могут оба присутствовать

Foreigner 11-02-2023 22:19 3002950

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 3002966

Цитата:

Цитата Asdshka
есть большой файл »

Тогда вопрос: насколько большой?
Цитата:

Цитата Asdshka
надо удалить спецсимволы после разделителя »

Вы тогда настройтесь, сконцентрируйтесь и составьте полные условия задачи в целом...


Время: 00:49.

Время: 00:49.
© OSzone.net 2001-