Показаны наиболее выделенные сообщения темы
Вернуться в полную тему
1
>>>
Вот, набросал для вас программку на Питоне для множественной замены. Работает быстро и просто

Код:
import sys
dict = [
   ('утро', 'вечер'),
   ('привет', 'пока')
 ]
s=open(sys.argv[1],'r').read()
for r in dict: s=s.replace(r[0],r[1])
open(sys.argv[2],'w').write(s)

1) Сохраняете ее под любым именем, например, "replace.py"
2) Запускаете через командную строку вида "python replace.py имя_исходного_файла имя_конечного_файла"

В массиве dict перечисляется, соответственно, список всех нужных замен в формате ('что берем', 'на что заменяем').
2019.01.18
Тема Ответить
2
>>>
Такие вещи пишутся на Javascript (HTA-приложение), Python, Powershell. Java это слишком тяжеловесно.

Вот скрипт на powershell:

powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | Out-File myFile.txt"
2019.01.18
Тема Ответить
3
>>>
2019.01.18строгий промискуитет А если в тексте, например, окажется слово "приветики"?

Да, хороший вопрос. Если в случае с русским языком еще можно границу слов как-то отловить, то в случае с китайским еще хуже. Единственное, что можно сходу предложить, это делать замены, начиная с самых длинных слов, переходя к коротким лишь в конце. Для этого после задания словаря (dict =...) надо добавить одну строку

Код:
dict = sorted(dict, key=lambda d:-len(d[0]))
2019.01.18
Тема Ответить
4
>>>
snum23
Да, почитайте что-нибудь по Python.

Кстати, лезть в исходник каждый раз неудобно. В качестве идеи доработки можно вынести таблицу замен в excel-евский файл с тремя столбцами слово_иероглифами/перевод/пиньинь и допилить скрипт замены, чтобы он использовал уже этот внешний экселевский файл. Это все тоже на питоне в десять строк делается. Но зато тогда таким "софтом" уже сможет пользоваться любой, не залезая в код, плюс можно будет иметь разные наборы замен для разных случаев.
2019.01.18
Тема Ответить
5
>>>
2019.01.18Рейхсканцлер В качестве идеи доработки можно вынести таблицу замен в excel-евский файл с тремя столбцами слово_иероглифами/перевод/пиньинь и допилить скрипт замены, чтобы он использовал уже этот внешний экселевский файл.

2019.01.18snum23 Я заменяю иероглиф, например, 好, на метку которая содержит этот же иероглиф внутри, типа 好 => [qtip:好|перевод|hao]

Не удержался, сделал все вышеописанное.

Работает так:
1) создаете заранее в Excel файлик, в котором будет содержаться словарь. В файле должно быть три столбца "слово иероглифами", "перевод", "пиньинь". Пример прилагается ("dict.xlsx")
2) исходный текст для конвертации сохраняете в кодировке utf-8. Пример тоже прилагается ("input.txt")
3) запускаете "python replace.py dict.xlsx input.txt output.txt", получаете результат "output.txt" тоже в кодировке utf-8

Пример
1) было на входе
Код:
Китайский текст 不错必须长必只 и еще что-то
2) стало на выходе
Код:
Китайский текст [qtip:不错|неплохо|búcuò][qtip:必须|необходимо|bìxū][qtip:长|продолжительность|cháng]必[qtip:只|только|zhi] и еще что-то

Полезные моменты
а) Для работы скрипта надо предварительно подключить в питоне пакет xlrd через однократный запуск в командной строке "pip install xlrd".
б) Сделана защита от повторной замены. При замене заменяются только те слова, перед которыми еще нет символа ":". То есть, если "只" заменить на "[qtip:只|только|zhi]", то повторный прогон скрипта уже увидит двоеточие перед 只 и не будет его заменять повторно. За это отвечает "([^\:]{1})" в re.sub.
в) Кодировку файлов на входе / выходе можете сами отрегулировать (см параметры "utf-8" в функциях чтения/записи).
г) Шаблон для замены тоже можно править как угодно. Пока сделана замена вида 好 => [qtip:好|перевод|пиньинь]

Сам текст скрипта без учета комментариев теперь занимает аж 10 строк. Боюсь представить, сколько это займет на Java 14
Код:
# This Python file uses the following encoding: utf-8
import sys, xlrd, re
dict = []

# Читаем файл Excel
s = xlrd.open_workbook(sys.argv[1]).sheet_by_index(0)

# На базе трех его столбцов создаем массив замен dict, используя шаблон a => [qtip:{a}|{b}|{c}]
for i in range(s.nrows):
   row = s.row_values(i)
   dict.append((row[0], '[qtip:{a}|{b}|{c}]'.format(a=row[0], b=row[1], c=row[2])))
dict=sorted(dict, key=lambda d:-len(d[0]))

# Собственно, сама замена
s=open(sys.argv[2], 'r', encoding='utf-8').read()
for r in dict: s=re.sub('([^\:]{1})' + r[0], r'\1' + r[1], s)
open(sys.argv[3], 'w', encoding='utf-8').write(s)

Я думаю, если вы разберетесь в этом простом коде, у вас уже будет широкое поле для своих экспериментов.

.zip replace.zip (Размер: 6.78 Кб)
2019.01.18
Тема Ответить
6
>>>
2019.01.19snum23 При запуске возникла проблемка:
File "replace.py", line 11, in <module>
  dict.append((row[0], '[qtip:{a}|{b}|{c}]'.format(a=row[0], b=row[1], c=row[2])))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

PS: не знаю насколько важно питон у меня по умолчанию 2.7.10 на маке

Ошибка у вас вызвана тем, что во всех внутренних преобразованиях (например, даже при конкатенации строк) питон версии 2.7 использует однобайтовую кодировку ASCII, а не Unicode, и для работы с китайскими символами это жутко неудобно - приходится перед любой строкой, в которой может быть что-то иероглифичное, писать префикс "u", а с файлами работать в бинарном режиме, а не текстовом.  Эти трудности были убраны еще в 2008 году, в третьей версии питона, но до сих пор иногда встречается предустановленный питон второй версии, как у вас.

Попробуйте вот такой вариант, который совместим со всем диапазоном версий 2.7... 3.7:

Код:
# This Python file uses the following encoding: utf-8
import sys, xlrd, re
dict = []

# Читаем файл Excel
s = xlrd.open_workbook(sys.argv[1]).sheet_by_index(0)

# На базе трех его столбцов создаем массив замен dict, используя шаблон a => [qtip:{a}|{b}|{c}]
for i in range(s.nrows):
   row = s.row_values(i)
   dict.append((u''+row[0], u'[qtip:{a}|{b}|{c}]'.format(a=row[0], b=row[1], c=row[2])))
dict=sorted(dict, key=lambda d:-len(d[0]))

# Собственно, сама замена
s=open(sys.argv[2], 'rb').read().decode("UTF-8")
for r in dict: s=re.sub('([^\:]{1})' + r[0], r'\1' + r[1], s)
open(sys.argv[3], 'wb').write(s.encode("UTF-8"))

На будущее: если захотите плотно разобраться с языком, то под ваши задачи, где надо возиться как раз с китайским, гораздо удобнее питон третьей версии, 3.5 и выше. Скачать под Mac OS версии 10.6 и выше можно [тут].
2019.01.19
Тема Ответить
7
>>>
2019.02.21snum23 Рейхсканцлер, сейчас более конкретный вопрос.

Видимо, при наличии слов, состоящих из 3-х и большего числа иероглифов, надо усложнять логику и делать вложенный re.sub.

Вместо строки
Код:
for r in dict: s=re.sub(r'([^\:]{1})' + r[0] + r'([^\|]{1})', r'\1' + r[1] + r'\2', s)

Поставьте строку
Код:
for r in dict: s=re.sub(r'(^|\])([^\[\]]*)(\[|$)',lambda m:m.group(1)+re.sub(r[0],r[1],m.group(2))+m.group(3),s)

Теперь логика такая:
1) первый re.sub ищет в тексте "необработанные" фрагменты, которые лежат вовне скобок [...] , то есть которые начинаются символом "]" и заканчиваются символом "[" (или которые ограничены началом/концом всего текста, если нужных символов не нашлось). За поиск таких фрагментов отвечает регулярное выражение r'(^|\])([^\[\]]*)(\[|$)'. При этом все то, что попало внутрь скобок [...] , будет пропускаться без всяких изменений.
2) для обработки каждого такого фрагмента вызывается некоторая функция, которая объявляется в этой же строке (посредством специального слова "lambda")
3) эта функция в переданном ей тексте посредством второго re.sub делает уже обычную замену иероглифов на [qtip:...]

Короче говоря, внешний re.sub разбивает строку на фрагменты, лежащие вне скобок, а внутренний re.sub делает замену в каждом полученном фрагменте.

Единственное, неясно, как это все будет работать с большими текстами порядка мегабайтов и/или при наличии слишком большого числа заменяемых слов (порядка десятков тысяч). Посмотрите там на ваших объемах. Если будет тормозить, есть еще одно решение, оно точно очень быстрое, но его сложнее писать.

.zip replace.py.zip (Размер: 695 байт)
2019.02.26
Тема Ответить