Hugo, - огромное спасибо!!!! все работает. а то я шефу пообещал сроки назвал а когда начал разбираться то понял что будет пипец. теперь еще время останется на свои дела. уф!! реально гора с плеч
Hugo, - огромное спасибо!!!! все работает. а то я шефу пообещал сроки назвал а когда начал разбираться то понял что будет пипец. теперь еще время останется на свои дела. уф!! реально гора с плечAlexander
А вообще смотря по задаче - может быть она в том, чтоб сделать тоже текст, но поменьше Тогда можно результат сразу писать в другой текстовый файл. И вообще без Экселя, аналогичным скриптом vbs. Хотя кажется под Экселем эти скрипты шевеляться быстрее.
А вообще смотря по задаче - может быть она в том, чтоб сделать тоже текст, но поменьше Тогда можно результат сразу писать в другой текстовый файл. И вообще без Экселя, аналогичным скриптом vbs. Хотя кажется под Экселем эти скрипты шевеляться быстрее.Hugo
ну в принципе да нужно выдергивать строки с шагом - но то что я получил, я вполне доволен. вообще в итоге я не удовлетворен на 100% но это уже другая история потому как я не могу понять алгоритм данных в исходном файле но это уже другая песня.
ну в принципе да нужно выдергивать строки с шагом - но то что я получил, я вполне доволен. вообще в итоге я не удовлетворен на 100% но это уже другая история потому как я не могу понять алгоритм данных в исходном файле но это уже другая песня.Alexander
Ну можно анализировать все входящие строки - например искать что-то приметное и от этой строки отсчитать определённое число строк, следующую брать, затем опять ждать метку.
Ну можно анализировать все входящие строки - например искать что-то приметное и от этой строки отсчитать определённое число строк, следующую брать, затем опять ждать метку.Hugo
Hugo, - стыдно признаться но мой мозг не способен переварить эту задачу. да можно проанализировать и задать границы или коридор отслеживания, но сейчас нужно прежде всего работу сделать.
еще раз хочу поблагодарить вас за помощь - ваш макрос хорошо работает и очень облегчил мне жизнь. спасибо
Hugo, - стыдно признаться но мой мозг не способен переварить эту задачу. да можно проанализировать и задать границы или коридор отслеживания, но сейчас нужно прежде всего работу сделать.
еще раз хочу поблагодарить вас за помощь - ваш макрос хорошо работает и очень облегчил мне жизнь. спасибоAlexander
Когда будет время - можем вернуться к вопросу. В другой теме или в этой же.
И кстати можно написать код побыстрее - например собирать строки в коллекцию, затем их переложить по полям в созданный массив (когда известен размер), затем массив выгрузить на лист.
На здоровье
Когда будет время - можем вернуться к вопросу. В другой теме или в этой же.
И кстати можно написать код побыстрее - например собирать строки в коллекцию, затем их переложить по полям в созданный массив (когда известен размер), затем массив выгрузить на лист.Hugo
Так, поправка. Этот вариант кода будет работать на десяток секунд быстрее. Если проверите - расскажите
[vba]
Code
Sub readtxt() Dim i&, ii&, strFilePath$, objTS Application.ScreenUpdating = False
strFilePath = "C:\test.txt" Set objTS = CreateObject("Scripting.FileSystemObject").OpenTextFile(strFilePath, 1)
Do Until objTS.AtEndOfStream i = i + 1 If i Mod 8 <> 0 Then objTS.SkipLine Else Application.StatusBar = "Read line " & i ii = ii + 1 Range(Cells(ii, 1), Cells(ii, 3)) = Split(objTS.Readline, ",") End If Loop
objTS.Close Set objTS = Nothing Application.StatusBar = False Application.ScreenUpdating = True End Sub
[/vba] Зачем читать строки, которые не нужны? Будем пропускать.
Так, поправка. Этот вариант кода будет работать на десяток секунд быстрее. Если проверите - расскажите
[vba]
Code
Sub readtxt() Dim i&, ii&, strFilePath$, objTS Application.ScreenUpdating = False
strFilePath = "C:\test.txt" Set objTS = CreateObject("Scripting.FileSystemObject").OpenTextFile(strFilePath, 1)
Do Until objTS.AtEndOfStream i = i + 1 If i Mod 8 <> 0 Then objTS.SkipLine Else Application.StatusBar = "Read line " & i ii = ii + 1 Range(Cells(ii, 1), Cells(ii, 3)) = Split(objTS.Readline, ",") End If Loop
objTS.Close Set objTS = Nothing Application.StatusBar = False Application.ScreenUpdating = True End Sub
[/vba] Зачем читать строки, которые не нужны? Будем пропускать.Hugo
Т.е. первое число должно быть >=683000.00, второе число должно быть >=5111000.00 И в то же время первое число должно быть <=684000.00, второе число должно быть <=5112000.00
Не понял насчёт шага - выбираем каждое n значение из прошедших такую проверку, или каждую n строку проверяем на эти условия? Во втором случае может получиться, что мало что отберётся...
А сделать в общем не сложно - split'ом бъём строку на части, четырьмя вложенными IF THEN проверяем на соответствие критерию, копируем/не копируем.
Или например так:
[vba]
Code
Sub tt() stroka = "683247.60,5111249.90,-25.42 " arr = Split(stroka, ",")
Select Case arr(0) Case 683000 To 684000 Select Case arr(1) Case 5111000 To 5112000 MsgBox "отбираем" End Select End Select
End Sub
[/vba]
Т.е. первое число должно быть >=683000.00, второе число должно быть >=5111000.00 И в то же время первое число должно быть <=684000.00, второе число должно быть <=5112000.00
Не понял насчёт шага - выбираем каждое n значение из прошедших такую проверку, или каждую n строку проверяем на эти условия? Во втором случае может получиться, что мало что отберётся...
А сделать в общем не сложно - split'ом бъём строку на части, четырьмя вложенными IF THEN проверяем на соответствие критерию, копируем/не копируем.
Или например так:
[vba]
Code
Sub tt() stroka = "683247.60,5111249.90,-25.42 " arr = Split(stroka, ",")
Select Case arr(0) Case 683000 To 684000 Select Case arr(1) Case 5111000 To 5112000 MsgBox "отбираем" End Select End Select
Речь идет о предидущем макросе ( выбор строк с заданым шагом) тоесть отбор с шагом 8 должен проводиться в диапозоне
первое число должно быть >=683000.00, второе число должно быть >=5111000.00 И в то же время первое число должно быть <=684000.00, второе число должно быть <=5112000.00
Правильно донести мысль уже пол дела :-(
Речь идет о предидущем макросе ( выбор строк с заданым шагом) тоесть отбор с шагом 8 должен проводиться в диапозоне
первое число должно быть >=683000.00, второе число должно быть >=5111000.00 И в то же время первое число должно быть <=684000.00, второе число должно быть <=5112000.00Alexander
Sub readtxt() Dim i&, ii&, x, strFilePath$, objTS Application.ScreenUpdating = False
strFilePath = "C:\test.txt" Set objTS = CreateObject("Scripting.FileSystemObject").OpenTextFile(strFilePath, 1)
Do Until objTS.AtEndOfStream x = Split(objTS.Readline, ",") If UBound(x) = 2 Then 'если в строке есть две запятые Select Case x(0) 'проверка первого числа Case 683000 To 684000 Select Case x(1) 'проверка второго числа Case 5111000 To 5112000 i = i + 1 If i Mod 8 = 0 Then 'выбираем каждое 8-е из прошедших проверку Application.StatusBar = "Read line " & i ii = ii + 1 Range(Cells(ii, 1), Cells(ii, 3)) = x End If End Select End Select End If Loop
objTS.Close Set objTS = Nothing Application.StatusBar = False Application.ScreenUpdating = True End Sub
[/vba]
Попробуйте: [vba]
Code
Sub readtxt() Dim i&, ii&, x, strFilePath$, objTS Application.ScreenUpdating = False
strFilePath = "C:\test.txt" Set objTS = CreateObject("Scripting.FileSystemObject").OpenTextFile(strFilePath, 1)
Do Until objTS.AtEndOfStream x = Split(objTS.Readline, ",") If UBound(x) = 2 Then 'если в строке есть две запятые Select Case x(0) 'проверка первого числа Case 683000 To 684000 Select Case x(1) 'проверка второго числа Case 5111000 To 5112000 i = i + 1 If i Mod 8 = 0 Then 'выбираем каждое 8-е из прошедших проверку Application.StatusBar = "Read line " & i ii = ii + 1 Range(Cells(ii, 1), Cells(ii, 3)) = x End If End Select End Select End If Loop
objTS.Close Set objTS = Nothing Application.StatusBar = False Application.ScreenUpdating = True End Sub
Ну и хорошо. Там не совсем корректно получается Application.StatusBar = "Read line " & i Это не i-тая строка файла, а i-тая из строк, прошедших проверку, ну да ладно... Если нужно вывести именно какая строка файл анализируется - можно добавить ещё один счётчик после x = Split(objTS.Readline, ",") и выводить его. Но это будет тормозить процесс - есть смысл выводить только каждую 10-ю или даже реже - тоже аналогично отбирать с помощью Mod.
Ну и хорошо. Там не совсем корректно получается Application.StatusBar = "Read line " & i Это не i-тая строка файла, а i-тая из строк, прошедших проверку, ну да ладно... Если нужно вывести именно какая строка файл анализируется - можно добавить ещё один счётчик после x = Split(objTS.Readline, ",") и выводить его. Но это будет тормозить процесс - есть смысл выводить только каждую 10-ю или даже реже - тоже аналогично отбирать с помощью Mod.Hugo
Задача заключается в следующем. Это работа с координатами. Есть огромный массив точек на определенной территории. ( 1км х 1км) Мы знаем координаты Х и У в углах данной территории. Их мы указываем в пути к файлу strFilePath = "C:\ 674000_5102000.txt" то есть левый нижний угол территории = 674000.00,5102000.00 Мне нужно отфильтровать точки через определенную дистанцию которую я буду задавать (допустим 0.5). Значит увеличиваем сначала первое число на 0.5 674000.00,5102000.00 674000.50,5102000.00 674001.00,5102000.00 674001.50,5102000.00 674002.00,5102000.00 674002.50,5102000.00 674003.00,5102000.00 …. 675000.00,5102000.00 пока первое число не будет равно +1000.00 (675000.00). Потом второе число увеличиваем на 0.5 а первое опять увеличиваем 674000.00,5102000.50 674000.50,5102000.50 674001.00,5102000.50 674001.50,5102000.50 674002.00,5102000.50 674002.50,5102000.50 674003.00,5102000.50 ….. 675000.00,5102000.50 И вот так пока конечное значение не достигнет по х и по у 675000.00,5103000.00 В данном шаге мы определяем параметры отбора. То есть ближайшая точка каждой строке и есть то что нам нужно т.е Выбирается точка с параметрами близкими к указанным. Дано 674216.50,5102536.50 Самая подходящая точка 674217.12,5102536.75,-25.62 674216.50,5102536.63,-25.61 вот эта 674215.88,5102536.52,-25.62 674215.26,5102536.40,-25.62 Трудность заключается в том, что нужно определить точность отбора. Если в строке есть, допустим точки с похожими параметрами то необходимо выбрать самую близкую. Возможно, необходимо задать деопозон от 0.01 до 0.49 Дано 674216.50,5102536.50 Из этих точек лучшая 674216.50,5102536.63,-25.61 674216.50,5102536.51,-25.61 вот эта 674216.54,5102536.63,-25.61 674216.60,5102536.50,-25.61 В приложенном файле примерно показано исходное положение точек и идеальное положение после фильтрации.
Привет всем. Хотелось бы вернуться к данной теме.
Задача заключается в следующем. Это работа с координатами. Есть огромный массив точек на определенной территории. ( 1км х 1км) Мы знаем координаты Х и У в углах данной территории. Их мы указываем в пути к файлу strFilePath = "C:\ 674000_5102000.txt" то есть левый нижний угол территории = 674000.00,5102000.00 Мне нужно отфильтровать точки через определенную дистанцию которую я буду задавать (допустим 0.5). Значит увеличиваем сначала первое число на 0.5 674000.00,5102000.00 674000.50,5102000.00 674001.00,5102000.00 674001.50,5102000.00 674002.00,5102000.00 674002.50,5102000.00 674003.00,5102000.00 …. 675000.00,5102000.00 пока первое число не будет равно +1000.00 (675000.00). Потом второе число увеличиваем на 0.5 а первое опять увеличиваем 674000.00,5102000.50 674000.50,5102000.50 674001.00,5102000.50 674001.50,5102000.50 674002.00,5102000.50 674002.50,5102000.50 674003.00,5102000.50 ….. 675000.00,5102000.50 И вот так пока конечное значение не достигнет по х и по у 675000.00,5103000.00 В данном шаге мы определяем параметры отбора. То есть ближайшая точка каждой строке и есть то что нам нужно т.е Выбирается точка с параметрами близкими к указанным. Дано 674216.50,5102536.50 Самая подходящая точка 674217.12,5102536.75,-25.62 674216.50,5102536.63,-25.61 вот эта 674215.88,5102536.52,-25.62 674215.26,5102536.40,-25.62 Трудность заключается в том, что нужно определить точность отбора. Если в строке есть, допустим точки с похожими параметрами то необходимо выбрать самую близкую. Возможно, необходимо задать деопозон от 0.01 до 0.49 Дано 674216.50,5102536.50 Из этих точек лучшая 674216.50,5102536.63,-25.61 674216.50,5102536.51,-25.61 вот эта 674216.54,5102536.63,-25.61 674216.60,5102536.50,-25.61 В приложенном файле примерно показано исходное положение точек и идеальное положение после фильтрации.Alexander
Уважаемый Michael_S, я вернулся к своей теме которую я создал пару месяцев назад. Может быть моя последняя задача и отличается от первоначальной но суть остается ( фильтрация значений с заданным шагом или параметрами)
я бы не хотел плодить множество тем.
Уважаемый Michael_S, я вернулся к своей теме которую я создал пару месяцев назад. Может быть моя последняя задача и отличается от первоначальной но суть остается ( фильтрация значений с заданным шагом или параметрами)