11
2019.01.18Рейхсканцлер Вот, набросал для вас программку на Питоне для множественной замены. Работает быстро и просто

Код:
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
Ответить
12
2019.01.18строгий промискуитет А если в тексте, например, окажется слово "приветики"?

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

Код:
dict = sorted(dict, key=lambda d:-len(d[0]))
2019.01.18
Ответить
13
2019.01.18Рейхсканцлер snum23

В общем, если питоновские скрипты у вас нормально работают, то рекомендую пользоваться именно питоном. Как правило, решение задач на Java оказывается в среднем в 4-5 раз более громоздким, чем на Python (сравните код на JAVA, который вам там на видео предлагали из 45 строк, и код на Python из 10 строк), и для мелких бытовых задачек типа вашей ничего удобнее, мне кажется, нет. Язык очень простой и логичный.

UPD : проверьте там работу на реальном файле с китайскими иероглифами. Могут быть проблемы с кодировкой, тогда надо будет еще пару строк в скрипте дописать.

да, как раз та проблема и была из-за кодировки (а не из-за того, что совпадение не найдено), так то код работает как надо!
чтобы решить проблему поставил сверху:
# This Python file uses the following encoding: utf-8
import os, sys

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

Код:
dict = sorted(dict, key=lambda d:-len(d[0]))

уже начал искать как такое реализовать, а в этой теме уже отвечают Smile
но скорее всего это не подойдет именно для моих целей. Так как я заменяю иероглиф, например, 好, на метку которая содержит этот же иероглиф внутри, типа 好 => [qtip:好|перевод|hao]
но все равно даже в таком виде программа сможет делать очень много работы за меня
еще раз спасибо за знакомство с питоном, про "тяжеловесность" java понял  21

поизучаю питона немного на досуге

PS: круто, что здесь на БКРС можно найти такое комьюнити, которое пояснит, поможет. Боюсь, на оверфлоу меня бы просто заминусили с моими проблемами
2019.01.18
Ответить
15
snum23
Да, почитайте что-нибудь по Python.

Кстати, лезть в исходник каждый раз неудобно. В качестве идеи доработки можно вынести таблицу замен в excel-евский файл с тремя столбцами слово_иероглифами/перевод/пиньинь и допилить скрипт замены, чтобы он использовал уже этот внешний экселевский файл. Это все тоже на питоне в десять строк делается. Но зато тогда таким "софтом" уже сможет пользоваться любой, не залезая в код, плюс можно будет иметь разные наборы замен для разных случаев.
2019.01.18
Ответить
16
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 Кб / Загрузок: 15)
2019.01.18
Ответить
17
2019.01.18Рейхсканцлер Не удержался, сделал все вышеописанное.

просто фантастическая программка для нас!! премного благодарен!
пакет xlrd установил
при запуске возникла проблемка:
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)

Попытался погуглить и не смотря на то, что проблемка явно распространенная, пока не смог понять, что именно не нравится программке? ведь у нас вроде везде прописано про кодировку, файл эксель тоже в utf-8

как от этого избавиться? с моими поверхностными знаниями - пока не понял ничего

еще раз спасибо за такую волшебную прогу!)

PS: не знаю насколько важно питон у меня по умолчанию 2.7.10 на маке
2019.01.19
Ответить
18
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
Ответить
19
2019.01.19Рейхсканцлер На будущее: если захотите плотно разобраться с языком, то под ваши задачи, где надо возиться как раз с китайским, гораздо удобнее питон третьей версии, 3.5 и выше. Скачать под Mac OS версии 10.6 и выше можно [тут].
огромное спасибо!!! теперь все работает!!
если что к вам можно обращаться по пайтону? в личку например?
начал изучать его, но так как полный нуб, возможно, будут вопросы Smile обещаю сначала гуглить, потом уже обращаться с вопросами
2019.01.20
Ответить
20
2019.01.19Рейхсканцлер
Код:
# 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"))

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

еще попытался ваш код слегка модифицировать, чтобы обработанные слова не только бы фильтровались re.sub по наличию “:” перед ними, но и еще вертикалью “|” после этих слов.
но ничего не получилось, последнее, что пробовал это такое
Код:
for r in dict: s=re.sub('([^\:]{1}[^\|])' + r[0], r'\1' + r[1], s)
пробовал после {1} ставить [^\|] ничего лучше не придумал) копался как работают regex и фильтры для них, ничего не понял, если честно, пока что не тот уровень

если несложно подскажете еще?
а то у меня двусложные слова бьются односложными с конца (спереди-то им не дает фильтр по ":", а вот сзади им ничего не мешает Smile )

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

в любому случае то, что уже есть - сильно облегчило жизнь, еще раз спасибо Smile
2019.01.22
Ответить