Всем доброго вечера!
Не смог кратко полностью описать в заголовке вопрос, но как бы основную проблему написал. Теперь подробнее.
На днях столкнулся с новой задачей и никак не могу ее до конца решить.
Суть:
Найти в файле "html" все конструкции типа спинтакс, например, "{Доброго дня|Здравствуйте|Привет}, {уважаемый|дорогой} Петр!", случайным образом выбрать один вариант и заменить им набор. Т.е., в результате должно получиться:
- Доброго дня, уважаемыйПетр!
- Здравствуйте, дорогой Петр!
- Привет, уважаемый Петр!
- и т.д.
Возникшие вопросы:
1. Как лучше считывать данные из файла "html" в кодировке UTF-8 без BOM?
Много всего перелопатил - получилось только импортом на лист (переделал из макрорекордера):
Проблема этого решения, что я не знаю как искать конструкции "{||}" в случае, если начало конструкции в одной строке, а конец в другой. Плюс, мне кажеться можно как-то обработать текст не записывая на лист, и соответственно будет работать быстрее.
2. Поиск конструкции "{||}"
С учетом п.1, ищу построчно:
Вопросы:
-Как обрабатывать если начало конструкции в одной строке, а конец в другой (вполне может быть что даже не в следующей, а через одну или две)?
-Никак не придумаю как обрабатывать случаи, когда есть вложенные конструкции, например, "{Сегодня {отличный|хороший|прекрасный} день!|Как {дела|поживаете}}."
3. Сохранение полученного текста в формате "html" в кодировке UTF-8 без BOM.
Решил таким образом:
Функции "LoadTextFromTextFile" и "SaveTextToFile" нашел где-то на просторах интернета пару лет назад - спасибо автору - часто выручают:
Т.о., повторю вопросы:
1. Как лучше считывать данные из файла "html" в кодировке UTF-8 без BOM?
2. Как обрабатывать если начало конструкции в одной строке, а конец в другой (вполне может быть что даже не в следующей, а через одну или две)?
3. Никак не придумаю как обрабатывать случаи, когда есть вложенные конструкции, например, "{Сегодня {отличный|хороший|прекрасный} день!|Как {дела|поживаете}}."
Помогите пож-та.
Вродь пока все, извините за большое количество текста..
Не смог кратко полностью описать в заголовке вопрос, но как бы основную проблему написал. Теперь подробнее.
На днях столкнулся с новой задачей и никак не могу ее до конца решить.
Суть:
Найти в файле "html" все конструкции типа спинтакс, например, "{Доброго дня|Здравствуйте|Привет}, {уважаемый|дорогой} Петр!", случайным образом выбрать один вариант и заменить им набор. Т.е., в результате должно получиться:
- Доброго дня, уважаемыйПетр!
- Здравствуйте, дорогой Петр!
- Привет, уважаемый Петр!
- и т.д.
Возникшие вопросы:
1. Как лучше считывать данные из файла "html" в кодировке UTF-8 без BOM?
Много всего перелопатил - получилось только импортом на лист (переделал из макрорекордера):
| Код |
|---|
Sub loadhtml()
Dim wb As Workbook
Dim shM As Worksheet
Set wb = ActiveWorkbook
Set shM = wb.Sheets("Лист2")
sFiles = "c:\test\1.html"
With shM.QueryTables.Add(Connection:= _
"TEXT;" & sFiles, Destination:= _
Range("$A$1"))
.AdjustColumnWidth = False
.TextFilePlatform = 65001
.Refresh BackgroundQuery:=False
End With
End Sub |
Проблема этого решения, что я не знаю как искать конструкции "{||}" в случае, если начало конструкции в одной строке, а конец в другой. Плюс, мне кажеться можно как-то обработать текст не записывая на лист, и соответственно будет работать быстрее.
2. Поиск конструкции "{||}"
С учетом п.1, ищу построчно:
| Код |
|---|
Sub spintaks()
Dim wb As Workbook
Dim shM As Worksheet
Dim er& 'последняя строка
Dim arrTemp 'массив синонимов
Dim b& 'позиция искомого символа в строке, в нашем случае - "{"
Dim s$ 'конструкция типа "{||||}"
Dim a$ 'переменная для списка элементов массива
Dim poz As Integer 'позиция случайно выбранного значения
Dim wordi$ 'случайно выбранное значение (синоним) из массива
Set wb = ActiveWorkbook
Set shM = wb.Sheets("Лист3")
er = shM.Cells(shM.Rows.Count, 1).End(xlUp).Row
For i = 1 To er
b = InStr(1, shM.Cells(i, 1).value, "{")
Do While b <> 0
stri = shM.Cells(i, 1).value
s = Mid(stri, InStr(1, stri, "{"), Len(stri) - InStr(1, stri, "{") - (Len(stri) - InStr(1, stri, "}") - 1))
a = Replace(Replace(s, "}", ""), "{", "")
arrTemp = Split(a, "|")
Randomize
poz = Rnd * UBound(arrTemp)
wordi = arrTemp(poz)
shM.Cells(i, 1).value = Replace(shM.Cells(i, 1).value, s, wordi)
b = InStr(1, shM.Cells(i, 1).value, "{")
Loop
Next i
End Sub |
Вопросы:
-Как обрабатывать если начало конструкции в одной строке, а конец в другой (вполне может быть что даже не в следующей, а через одну или две)?
-Никак не придумаю как обрабатывать случаи, когда есть вложенные конструкции, например, "{Сегодня {отличный|хороший|прекрасный} день!|Как {дела|поживаете}}."
3. Сохранение полученного текста в формате "html" в кодировке UTF-8 без BOM.
Решил таким образом:
| Код |
|---|
Sub savehtm()
Dim wb As Workbook
Dim shM As Worksheet
Dim er& 'последняя строка
Dim mypath$ 'путь сохранения файла
Set wb = ActiveWorkbook
Set shM = wb.Sheets("Лист3")
mypath = "c:\test\1.html"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set outFile = FSO.CreateTextFile(mypath)
er = shM.Cells(shM.Rows.Count, 1).End(xlUp).Row
For i = 1 To er
outFile.WriteLine shM.Cells(i, 1).value
Next i
outFile.Close
ss = LoadTextFromTextFile(mypath)
sss = SaveTextToFile(ss, mypath, "utf-8noBOM")
End Sub |
Функции "LoadTextFromTextFile" и "SaveTextToFile" нашел где-то на просторах интернета пару лет назад - спасибо автору - часто выручают:
Скрытый текст |
|---|
| Function SaveTextToFile(ByVal txt$, ByVal Filename$, Optional ByVal encoding$ = "windows-1251") As Boolean ' функция сохраняет текст txt в кодировке Charset$ в файл filename$ On Error Resume Next: Err.Clear Select Case encoding$ Case "windows-1251", "", "ansi" Set FSO = CreateObject("scripting.filesystemobject") Set ts = FSO.CreateTextFile(Filename, True) ts.Write txt: ts.Close Set ts = Nothing: Set FSO = Nothing Case "utf-16", "utf-16LE" Set FSO = CreateObject("scripting.filesystemobject") Set ts = FSO.CreateTextFile(Filename, True, True) ts.Write txt: ts.Close Set ts = Nothing: Set FSO = Nothing Case "utf-8noBOM" With CreateObject("ADODB.Stream") .Type = 2: .Charset = "utf-8": .Open .WriteText txt$ Set binaryStream = CreateObject("ADODB.Stream") binaryStream.Type = 1: binaryStream.Mode = 3: binaryStream.Open .Position = 3: .CopyTo binaryStream 'Skip BOM bytes .flush: .Close binaryStream.SaveToFile Filename$, 2 binaryStream.Close End With Case Else With CreateObject("ADODB.Stream") .Type = 2: .Charset = encoding$: .Open .WriteText txt$ .SaveToFile Filename$, 2 ' сохраняем файл в заданной кодировке .Close End With End Select SaveTextToFile = Err = 0: DoEvents End Function Function LoadTextFromTextFile(ByVal Filename$, Optional ByVal encoding$) As String ' функция загружает текст в кодировке Charset$ из файла filename$ On Error Resume Next: Dim txt$ If Trim(encoding$) = "" Then encoding$ = "windows-1251" With CreateObject("ADODB.Stream") .Type = 2: If Len(encoding$) Then .Charset = encoding$ .Open .LoadFromFile Filename$ ' загружаем данные из файла LoadTextFromTextFile = .ReadText ' считываем текст файла .Close End With End Function |
Т.о., повторю вопросы:
1. Как лучше считывать данные из файла "html" в кодировке UTF-8 без BOM?
2. Как обрабатывать если начало конструкции в одной строке, а конец в другой (вполне может быть что даже не в следующей, а через одну или две)?
3. Никак не придумаю как обрабатывать случаи, когда есть вложенные конструкции, например, "{Сегодня {отличный|хороший|прекрасный} день!|Как {дела|поживаете}}."
Помогите пож-та.
Вродь пока все, извините за большое количество текста..