0 / 0 / 0
Регистрация: 03.04.2015
Сообщений: 45
1

Создание макроса

08.04.2016, 15:51. Показов 1470. Ответов 42
Метки нет (Все метки)

Доброго времени суток господа.
Помогите решить проблему.
Есть информация в текстовом виде такого рода:
Begin Actor Class=StaticMeshActor
Begin Object Name="StaticMeshComponent0"
StaticMesh=StaticMesh'/Game/StatichMeshes/v_obj_s/O_Fence02-1'
RelativeLocation=(X=-97193.429688,Y=258821.125000,Z=-3612.254883)
RelativeRotation=(Pitch=1536,Yaw=-4624,Roll=1584)
End Actor
Таких строк в в файле может быть около 100 000

Как заставить эксейл считать и заменять значения Pitch/Yaw/Roll автоматически считать по формуле значение после знака =*на 360 и поделить на 65536, чтобы полученное значение автоматически поставилось вместо циферок на значение, что на примере выше.

Чтобы получилось такое:
Pitch=1536*360/65536=8,4375
Yaw=-4624*360/65536=-25,400390625
Roll=1584*360/65536=8,701171875
Чтобы в итоге был такой результат:
Begin Actor Class=StaticMeshActor
Begin Object Name="StaticMeshComponent0"
StaticMesh=StaticMesh'/Game/StatichMeshes/v_obj_s/O_Fence02-1'
RelativeLocation=(X=-97193.429688,Y=258821.125000,Z=-3612.254883)
RelativeRotation=(Pitch=8,4375,Yaw=-25,400390625,Roll=8,701171875)
End Actor
И если есть возможность, чтобы заместо запятой были точки RelativeRotation=(Pitch=8.4375,Yaw=-25.400390625,Roll=8.701171875)

А так же чтобы значение после точки не превышало шести значное число.

Загрузил файл в формате эксейля и на всякий случай в текстовом блоктоне.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2016, 15:51
Ответы с готовыми решениями:

Создание макроса
Здравствуйте! Помогите пожалуйста. Создаю макрос , а при выполнении макроса выдает: запрашиваемый...

Создание макроса
Помогите. Нужно чтобы при нажатии кнопки "Узнать результат" он переходил на страницу с результатами...

Создание макроса new!
Нужно с помощью макроса отсортировать данные так, чтобы ФИО не повторялось, а код (столбец:код)...

Создание макроса
Нужен макрос, который будет из определенной папки переименовывать файл excel удалением сначала 16...

42
6856 / 2791 / 529
Регистрация: 19.10.2012
Сообщений: 8,521
08.04.2016, 16:15 2
Читаем файл построчно, пишем построчно в другой файл.
Но - если в строке есть "Pitch=" (ну или если начало с "RelativeRotation=(Pitch="), то извлекаем все числа, подменяем на высчитанные, генерим новую строку, пишем вместо оригинальной.
Весь гемор как определить позицию чисел - но не особо большой гемор. Можно использовать Split(), Instr()+Mid(), или может regexp.
А заменить запятые на точки - это replace() по ходу дела. В нужной строке.
0
0 / 0 / 0
Регистрация: 03.04.2015
Сообщений: 45
08.04.2016, 16:41  [ТС] 3
Hugo121
А можно более понятно для идиота вроде меня?

Я пробую отфильтровать сначало RelativeRotation=(Pitch=*****,Yaw=******,Roll=*****)

Остаются видимые только RelativeRotation******, далее нажимаю найти и изменить Pitch= заменить на Pitch=!, далее нажимаю данные и текст по столбцам и ввожу другое и символ ! мне ещё вперёд фильтрует, остаются только цифры от Питч, дальше нажимаю тоже самое для Яаш и Ролл мне пишет ошибку "заменить содержимое конечных ячеек. Если нажать да, он что впереди удалит, если попробывать выделить столбцы и перетащить их вперёд, мне пишет ошибку Данная команда неприминима для несвязанных диапозонов, выберите один диапазон и снова выберите команду.
Я готов купить скрип за небольшую сумму, ибо я уже несколько дней с утра до ночи мучаюсь с этим.

В представлении всё возможно. Есть значение Pitch= цифры, у Yaw и у ролл тоже самое. Всё что нужно чтобы Эксейл сам нашёл строки с Питч Яш и Ролл и по формуле Pitch=число*360/65536 и записал вместо того что там было.

ХЕЛП!
0
6856 / 2791 / 529
Регистрация: 19.10.2012
Сообщений: 8,521
08.04.2016, 16:57 4
Я описал алгоритм макроса, работающий сразу с текстовым файлом, не зависимо от приложения - хоть в ворде, хоть в экселе, хоть в кореле или где там ещё есть вба.
А лучше в wsh/vbs, т.е. голый скрипт, запускается кликом по самому скрипту в папке.
Написать можно, но не прямо сейчас. Может вечером дома, но сегодня ведь пятница, так что...
1
0 / 0 / 0
Регистрация: 03.04.2015
Сообщений: 45
08.04.2016, 17:09  [ТС] 5
Hugo121

Я пробую в Эксейле, но также и в NotePad++ заменяю.

Я пробую и пробую но всё без результатов и так уже третьи сутки на пролёт.
Таких файлов у меня 141, общее кол-во строк где нужно править в данный момент осталось 102 тысячи из 141 файла. Вручную я уже посчитал на калькуляторе и заменил около 30 тысяч строк.
Буду пробывать дальше через Эксейль, я догадывался изначально что это очень сложная проблема и не скорое решение. Либо делать дальше вручную, на это уйдёт месяца 4 ещё, либо пробывать программно что то делать.

Жаль что Эксейл не продуман на Элементарное, найти по слову после слова если есть знак равно и цифры, чтобы эти цифры автоматом по одной и той же формуле считались и записывались заместо старых циферок.

Я до сих пор надеюсь на любую помощь, живу в России так что я не очень богат, но пару сотен я бы наскрёб за скрипт, я уверен кто умеет это делать, смог бы сделать за пару минут. А ещё надеюсь что есть люди, кому интересны подобные сложности и они любят решать их.
0
6856 / 2791 / 529
Регистрация: 19.10.2012
Сообщений: 8,521
08.04.2016, 17:13 6
Эксель (т.е. Microsoft) это продумал - в Экселе есть VBA, и другие скриптовые языки, и не особо сложно написать программу, обрабатывающую всю эту кучу файлов секунд за 5-10.
Но писать нужно время (время, не пару минут!), и умение, что и впрямь стОит денег. Но может кто напишет for fun?
0
2045 / 1399 / 656
Регистрация: 23.03.2015
Сообщений: 4,546
08.04.2016, 19:36 7
Цитата Сообщение от Hugo121 Посмотреть сообщение
Но может кто напишет for fun?
Попробую....учиться и в 47 лет не поздно
0
Заблокирован
08.04.2016, 21:07 8
TPAKC327, поскольку вложения не получились - уточните:
Цитата Сообщение от TPAKC327 Посмотреть сообщение
(Pitch=*,Yaw=*,Roll=*)
всегда если есть в строке, то все одновременно, именно в такой последовательности, всегда в скобках и целые?
0
2045 / 1399 / 656
Регистрация: 23.03.2015
Сообщений: 4,546
08.04.2016, 21:23 9
В принципе сделал.....
Кликните здесь для просмотра всего текста


PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Sub Replace()
Dim S() As String
Dim P, Y, R As String
For i = 1 To ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row
If InStr(Cells(i, 2).Value, "Pitch") <> 0 Then
S = Split(Cells(i, 2).Value, Chr(61))
If Left(S(2), InStr(S(2), Chr(44)) - 1) * 360 / 65536 <> 0 Then
P = CStr(Round(Left(S(2), InStr(S(2), Chr(44)) - 1) * 360 / 65536, 6)) & Chr(44) & "Yaw"
Else
P = "0" & Chr(44) & "Yaw"
End If
S(2) = P
If Left(S(3), InStr(S(3), Chr(44)) - 1) * 360 / 65536 <> 0 Then
Y = CStr(Round(Left(S(3), InStr(S(3), Chr(44)) - 1) * 360 / 65536, 6)) & Chr(44) & "Roll"
Else
Y = "0" & Chr(44) & "Roll"
End If
S(3) = Y
If Left(S(4), InStr(S(4), Chr(41)) - 1) * 360 / 65536 <> 0 Then
R = CStr(Round(Left(S(4), InStr(S(4), Chr(41)) - 1) * 360 / 65536, 6)) & Chr(41)
Else
R = "0" & Chr(41)
End If
S(4) = R
Cells(i, 2).Value = Join(S, "=")
End If
Next
End Sub
Вложения
Тип файла: rar 17_25.rar (84.3 Кб, 5 просмотров)
0
2045 / 1399 / 656
Регистрация: 23.03.2015
Сообщений: 4,546
08.04.2016, 21:34 10
P.S. У меня аглицкий расклад, поэтому не учел Decimal separator...

Добавлено через 3 минуты
В принципе переключив региональные стандарты можно заменить "," на "."
Shersh, Hugo121, как это сделать кодом?
0
6856 / 2791 / 529
Регистрация: 19.10.2012
Сообщений: 8,521
08.04.2016, 21:43 11
Что именно сделать? Заменить в строке "," на "." - заменой
Я часто так и делаю, но меняю не на точку, а на mid$(1/2,2,1)
Ну и далее нужно превратить в число, но при арифметической операции оно автоматом преобразуется.
0
2045 / 1399 / 656
Регистрация: 23.03.2015
Сообщений: 4,546
08.04.2016, 21:53 12
Цитата Сообщение от Hugo121 Посмотреть сообщение
mid$(1/2,2,1)
Оригинально.
Цитата Сообщение от Hugo121 Посмотреть сообщение
Заменить в строке "," на "." - заменой


А если в примере ( как в данном) в строчке помимо разделителя есть еще запятые....
Тогда 1) заменить сначала запятые ( не decimal separator) на какой -нибудь оригинальный символ
2) "провернуть" замену decimal separator'a
3) вернуть запятые из 1го пункта на место
Так сработает?
0
6856 / 2791 / 529
Регистрация: 19.10.2012
Сообщений: 8,521
08.04.2016, 22:00 13
Ну изначально (из того что видно в теме) там нет проблем с разделителями, там целые числа.
Так что думаю нет проблем в итоговой строке заменить разделители на запятые и выгрузить в строку.
И даже не нужно мудрить с mid$(1/2,2,1) - просто меняем точки на запятые, если они есть - заменятся. Если нет - и не надо.
А если речь про строку RelativeLocation= - так там тупо меняем сразу все точки на запятые.
P.S. я говорю про работу с исходным текстом, а не с данными в Экселе!
1
2045 / 1399 / 656
Регистрация: 23.03.2015
Сообщений: 4,546
08.04.2016, 22:05 14
Hugo121,

Спасибо.
0
Заблокирован
08.04.2016, 22:16 15
Цитата Сообщение от TPAKC327 Посмотреть сообщение
Чтобы в итоге был такой результат:
Begin Actor Class=StaticMeshActor
Begin Object Name="StaticMeshComponent0"
StaticMesh=StaticMesh'/Game/StatichMeshes/v_obj_s/O_Fence02-1'
RelativeLocation=(X=-97193.429688,Y=258821.125000,Z=-3612.254883)
RelativeRotation=(Pitch=8,4375,Yaw=-25,400390625,Roll=8,701171875)
End Actor
Боюсь, что Unreal Engine подавится такой трансляцией: в линейных размерах разделитель - точка, в угловых - запятая
0
6856 / 2791 / 529
Регистрация: 19.10.2012
Сообщений: 8,521
08.04.2016, 22:58 16
Код vbs - сохранить текст с расширением vbs, даблкликнуть.
Но можно и вставить внутрь sub'а в любом приложении с VBA.
Должен быть исходный файл "C:\Temp\in.txt"
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
' FSO Constants
 
    t = Timer
    Const ForReading = 1
    Const ForAppending = 8
    Const TristateUseDefault = -2
 
    ' Variables
    Dim objFSO, objTS, objOTS, objfile, templine
 
    ' Instantiate the object
    Set objFSO = CreateObject("Scripting.FileSystemObject")
 
    ' open the text file read only
    Set objTS = objFSO.OpenTextFile("C:\Temp\in.txt", ForReading, False, TristateUseDefault)
    ' We now open the file to write it out
    If objFSO.FileExists("c:\Temp\out.txt") Then
        Set objOTS = objFSO.OpenTextFile("C:\Temp\out.txt", ForAppending)
    Else
        Set objfile = objFSO.CreateTextFile("C:\Temp\out.txt")
        Set objfile = Nothing
        Set objOTS = objFSO.OpenTextFile("C:\Temp\out.txt", ForAppending)
    End If
 
    Do While objTS.AtEndOfStream <> True
        templine = objTS.ReadLine()
        If InStr(templine, "RelativeRotation=(Pitch=") > 0 Then
            arr = Split(templine, ",")
            t1 = Replace(arr(0), "RelativeRotation=(Pitch=", "") * 360 / 65536
            t2 = Replace(arr(1), "Yaw=", "") * 360 / 65536
            t3 = Replace(Replace(arr(2), ")", ""), "Roll=", "") * 360 / 65536
            objOTS.Writeline "RelativeRotation=(Pitch=" & t1 & ",Yaw=" & t2 & ",Roll=" & t3 & ")"
        ElseIf InStr(templine, "RelativeLocation=(") > 0 Then
            objOTS.Writeline Replace(templine, ".", ",")
        Else
            objOTS.Writeline templine
        End If
    Loop
 
    ' Close all files after we read it in.
    objTS.Close
    Set objTS = Nothing
    objOTS.Close
    Set objOTS = Nothing
    Set objFSO = Nothing
    t = Timer - t
    MsgBox "OK! Run in " & t
Добавлено через 56 секунд
Можно навесить цикл по всем файлам каталога и вывод результатов в другой каталог.
0
0 / 0 / 0
Регистрация: 03.04.2015
Сообщений: 45
11.04.2016, 16:30  [ТС] 17
Hugo121
Извините пожалуйста интернет только сегодня появился,
Shersh - правильно подметил я совершил ошибку, результат должен быть через точки

RelativeRotation=(Pitch=8,4375,Yaw=-25,400390625,Roll=8,701171875) - так не правильно

RelativeRotation=(Pitch=8.4375,Yaw=-25.400390625,Roll=8.701171875) - вот так правильно

Ваш код что постом выше, вставил в текстовый блокнтон, поменял расширение с txt на vbs далее по пути C:\Temp переместил туда ваш файл и свой файл который нужный подредактировать. Он мне пишет ошибку:

Windows Script Host

Сценарий: C:\Temp\1.vbs
Строка: 15
Символ: 5
Ошибка: Файл не найден
Код: 800A0035
Источник: Ошибка выполнения Microsoft VBScript


Могу видео записать и загрузить последовательность моих действий
0
6856 / 2791 / 529
Регистрация: 19.10.2012
Сообщений: 8,521
11.04.2016, 16:32 18
Ошибка: Файл не найден
ну значит не найден.
Дайте ему свой исходный файл "C:\Temp\in.txt"
0
0 / 0 / 0
Регистрация: 03.04.2015
Сообщений: 45
11.04.2016, 16:49  [ТС] 19
Всё разобрался, оказывается дело в самой Виндовс, если просто так переминовать окончание файла .t3d на .txt то формат якобы не меняется, а если открыть .t3d скопировать оттуда информацию и воткнуть в новый созданый текстовый документ с названием in.txt то тогда всё работает!
У RelativeRotation табуляция в начали не учитывается, но это всё мелочи.

РЕСПЕКТ ВАМ МУЖИКИ, ЭТО ПРОСТО ШЕДЕВР! ))))))))))))))))))))))

СПАСИБО ВСЕМ!!!!!!!!!!!!!!!!

Добавлено через 10 минут
Проверил на практике, запятые в цифрах
Begin Map
Begin Actor Class=StaticMeshActor
Begin Object Name="StaticMeshComponent0"
StaticMesh=StaticMesh'/Game/StatichMeshes/field_deco_s/Orc_stone06'
RelativeLocation=(X=169461,812500,Y=14849,046875,Z=-3369,343994)
DrawScale=0.500000
End Actor
Begin Actor Class=StaticMeshActor
Begin Object Name="StaticMeshComponent0"
StaticMesh=StaticMesh'/Game/StatichMeshes/field_deco_s/Orc_stone06'
RelativeLocation=(X=184575,875000,Y=10209,044922,Z=-2777,875732)
RelativeRotation=(Pitch=0,Yaw=-49,3505859375,Roll=0)
End Actor

Именно между цифрами на точки бы переставить, из за запятых анриал не понимает, как и писал Shersh
0
6856 / 2791 / 529
Регистрация: 19.10.2012
Сообщений: 8,521
11.04.2016, 16:50 20
Цитата Сообщение от TPAKC327 Посмотреть сообщение
переминовать окончание файла .t3d на .txt
- а если наоборот - в коде вместо txt обрабатывать файл t3d?
Вообще вот поэтому обычно на других форумах всегда требуют примеры файлов - т.к. не всегда можно верить словам "заказчика"
Цитата Сообщение от TPAKC327 Посмотреть сообщение
Есть информация в текстовом виде такого рода:
- может она так и выглядит на экране, а что там в самом деле... И потраченное время будет потрачено зря, лучше фильм посмотреть (куча несмотренных лежит...)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2016, 16:50

Создание макроса
Добрый вечер! Такое задание. Создать макрос, изменяющий шрифт выделенного текста на Arial 16,...

Создание макроса
Доброго времени суток! Помогите автоматизировать процесс! Есть две книги : книга1.xlsx и...

Создание макроса автозаполнения
Всем привет! Подскажите, пожалуйста, как сделать проще, если данная задача не решаема. Я совсем...

Программное создание макроса
Доброго времени суток, форумчане! Прошу помощи с кодом! Есть форма, в которой содержаться...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.