Всем привет, иногда кажется, что все вроде, неплохо понял) По крайней мере, знаешь, куда подсмотреть И как только ты начинаешь так считать, какая-то задача ставит тебя в действительный ступор
У меня есть четыре файла txt В каждом из них сразу после времени, после запятой значения. Нужно выяснить, какое значение максимальное среди этих всех файлов В идеале вывести название этого файла c этим максимальным значением на лист 1 Может быть, что будет несколько файлов с максимальным значением, тогда нужно вывести несколько Тогда вывести на лист 1 все эти файлы, например списком...
Скажу сразу, так как от VBA ухожу. Хочу еще что-то с пайтон. Поэтому это решение у меня есть на пайтон. Можете посмотреть, что оно дает
[vba]
Код
import os import sys def find_max_value(fname): value = 0 with open(fname, encoding='cp866') as fn: try: for i in fn: v = int(i.split()[0].split(',')[1]) if v > value: value = v except IndexError: pass print(value,fname) return {value: fname}
def main(): # dirname = os.path.abspath(sys.argv[1]) dirname = ('H:\Выгрузки') os.chdir(dirname) res = {} for i in os.listdir(dirname): res.update(find_max_value(i)) print('Filename is: ', res.get(max(res)))
if __name__ == "__main__": main()
[/vba]
Пробовал объединять файлы в один(благо, есть коды для объединения txt файлов в один на страницу через диалог) Дальше делал текст по столбцам (ставил пробел и запятую) и дальше можно было искать максимум (имя файла рядом в строку не выводил уже...)
Файлов, ясно, что может быть не 4... а 1000, например...
Поэтому вариант с загоном всех данных на лист, а потом обработка через текст по столбцам будет не очень..
Как можно обращаться напрямую и читать? Теоретически - открыл файл, внес по маске регулярных выражений в словарь, фильтранулся в нем, закрыл файл. Практически... пока не знаю.. Честно сказать, этим на ходу изобретенным тестовым заданием, меня поставили в стопор, так как пришлось думать на ходу. А первый раз он... непонятный. Поэтому просто решил через текст по столбцам с объединением этих четырех файлов через макрос Если у кого-то более продвинутые решения? Приложил пример файла. Сам файл на 20000 в оригинале, файлов может быть намного больше
Всем привет, иногда кажется, что все вроде, неплохо понял) По крайней мере, знаешь, куда подсмотреть И как только ты начинаешь так считать, какая-то задача ставит тебя в действительный ступор
У меня есть четыре файла txt В каждом из них сразу после времени, после запятой значения. Нужно выяснить, какое значение максимальное среди этих всех файлов В идеале вывести название этого файла c этим максимальным значением на лист 1 Может быть, что будет несколько файлов с максимальным значением, тогда нужно вывести несколько Тогда вывести на лист 1 все эти файлы, например списком...
Скажу сразу, так как от VBA ухожу. Хочу еще что-то с пайтон. Поэтому это решение у меня есть на пайтон. Можете посмотреть, что оно дает
[vba]
Код
import os import sys def find_max_value(fname): value = 0 with open(fname, encoding='cp866') as fn: try: for i in fn: v = int(i.split()[0].split(',')[1]) if v > value: value = v except IndexError: pass print(value,fname) return {value: fname}
def main(): # dirname = os.path.abspath(sys.argv[1]) dirname = ('H:\Выгрузки') os.chdir(dirname) res = {} for i in os.listdir(dirname): res.update(find_max_value(i)) print('Filename is: ', res.get(max(res)))
if __name__ == "__main__": main()
[/vba]
Пробовал объединять файлы в один(благо, есть коды для объединения txt файлов в один на страницу через диалог) Дальше делал текст по столбцам (ставил пробел и запятую) и дальше можно было искать максимум (имя файла рядом в строку не выводил уже...)
Файлов, ясно, что может быть не 4... а 1000, например...
Поэтому вариант с загоном всех данных на лист, а потом обработка через текст по столбцам будет не очень..
Как можно обращаться напрямую и читать? Теоретически - открыл файл, внес по маске регулярных выражений в словарь, фильтранулся в нем, закрыл файл. Практически... пока не знаю.. Честно сказать, этим на ходу изобретенным тестовым заданием, меня поставили в стопор, так как пришлось думать на ходу. А первый раз он... непонятный. Поэтому просто решил через текст по столбцам с объединением этих четырех файлов через макрос Если у кого-то более продвинутые решения? Приложил пример файла. Сам файл на 20000 в оригинале, файлов может быть намного большеant6729
Чтение текстовых файлов - это думаю в любом учебнике на первом десятке страниц. Но могу подсказать - вот например получаем массив строк: [vba]
Код
A = Split(CreateObject("Scripting.FileSystemObject").Getfile(TxtPath$).OpenasTextStream(1).ReadAll, vbNewLine)
[/vba] Читаете построчно любым способом (или цикл по массиву строк), анализируете каждую строку (например Split 2 раза на 2 части), определяете максимум, а имена файлов можно собирать например в словарь максимумов с коллекцией имён файлов.
Чтение текстовых файлов - это думаю в любом учебнике на первом десятке страниц. Но могу подсказать - вот например получаем массив строк: [vba]
Код
A = Split(CreateObject("Scripting.FileSystemObject").Getfile(TxtPath$).OpenasTextStream(1).ReadAll, vbNewLine)
[/vba] Читаете построчно любым способом (или цикл по массиву строк), анализируете каждую строку (например Split 2 раза на 2 части), определяете максимум, а имена файлов можно собирать например в словарь максимумов с коллекцией имён файлов.Hugo
Честно сказать, сейчас только руки дошли, но ничего из двух примеров выше не понял В своем примере сейчас не понимаю, как вывести в debug только первые цифры после запятой
У меня выводит сначала до запятой как одну строку, а потом ниже после запятой, как вторую Прошу запустить код, чтобы понять, о чем я.
[vba]
Код
Sub SendReportFiles()
Dim fsoFile As file, fsoFolder As Folder Dim ReportFile Dim dict As Scripting.Dictionary Dim fso As New FileSystemObject Dim Spath, StrFile Spath = Application.ThisWorkbook.Path & "\" Set fsoFolder = fso.GetFolder(Spath)
Set dict = New Scripting.Dictionary
For Each fsoFile In fsoFolder.Files
If fsoFile Like "*.txt" Then 'dict.Add fsoFile.Name, 0
Open fsoFile For Input As #1 Dim s As String While Not EOF(1) Input #1, s Debug.Print Left(s, 20) '& " " & fsoFile.Name Wend Close #1
End If
Next fsoFile
End Sub
[/vba]
Помогите, пожалуйста, выводить без лишних строк, где время
Честно сказать, сейчас только руки дошли, но ничего из двух примеров выше не понял В своем примере сейчас не понимаю, как вывести в debug только первые цифры после запятой
У меня выводит сначала до запятой как одну строку, а потом ниже после запятой, как вторую Прошу запустить код, чтобы понять, о чем я.
[vba]
Код
Sub SendReportFiles()
Dim fsoFile As file, fsoFolder As Folder Dim ReportFile Dim dict As Scripting.Dictionary Dim fso As New FileSystemObject Dim Spath, StrFile Spath = Application.ThisWorkbook.Path & "\" Set fsoFolder = fso.GetFolder(Spath)
Set dict = New Scripting.Dictionary
For Each fsoFile In fsoFolder.Files
If fsoFile Like "*.txt" Then 'dict.Add fsoFile.Name, 0
Open fsoFile For Input As #1 Dim s As String While Not EOF(1) Input #1, s Debug.Print Left(s, 20) '& " " & fsoFile.Name Wend Close #1
End If
Next fsoFile
End Sub
[/vba]
Помогите, пожалуйста, выводить без лишних строк, где времяant6729
Сообщение отредактировал ant6729 - Пятница, 14.12.2018, 04:24
У меня в новом файле Ваш макрос ругается. Библиотеки какие подключены? Лень вручную лазать Приложите свой файл с макросом и вручную желаемый результат
У меня в новом файле Ваш макрос ругается. Библиотеки какие подключены? Лень вручную лазать Приложите свой файл с макросом и вручную желаемый результат_Boroda_
Библиотека Microsoft Scripting Runtime Попробовал сам допилить...
Прикрепил архивы и файл ниже
3 Еще хотел вывести в MsgBox не только максимальное, но и рядом название файла - не допер, как...Потому что вроде, application.max и рядом как fsoFile.Name или .Items, но как соответствующий... что-то не понял...
5 Если можно, оцените структуру кода, может, можно было иначе накидать, предполагаю, что можно было через массивы, но не силен.
Библиотека Microsoft Scripting Runtime Попробовал сам допилить...
Прикрепил архивы и файл ниже
3 Еще хотел вывести в MsgBox не только максимальное, но и рядом название файла - не допер, как...Потому что вроде, application.max и рядом как fsoFile.Name или .Items, но как соответствующий... что-то не понял...
5 Если можно, оцените структуру кода, может, можно было иначе накидать, предполагаю, что можно было через массивы, но не силен.ant6729
Выполнение кода на 15 КБ (4 файла txt) заняло минуту... Можно ли как-то оптимизироваться? Потому что, например (ну, я так думаю, мало ли) файлов будет 1000...
На Python, кстати, 2 секунды...
Выполнение кода на 15 КБ (4 файла txt) заняло минуту... Можно ли как-то оптимизироваться? Потому что, например (ну, я так думаю, мало ли) файлов будет 1000...
Много читал, ничего не понял. Архив не открывается, но 4 копии файла из №1 обрабатывает за 0,0078 сек (с выгрузкой на лист 0,0117). [vba]
Код
Sub мяв() Dim fName$ Dim i&, lMax& Dim spl, s Dim fso As New FileSystemObject Dim col As New Collection, x Dim t!, t1! t = Timer: t1 = t On Error Resume Next fName = Dir(ThisWorkbook.Path & "\*.txt") Do While fName$ <> "" s = fso.OpenTextFile(fName).ReadAll spl = Split(s, vbCrLf) For i = 0 To UBound(spl) If lMax < Val(Mid(spl(i), 10, 3)) Then lMax = Val(Mid(spl(i), 10, 3)) Set col = New Collection col.Add fName, fName ElseIf lMax = Val(Mid(spl(i), 10, 3)) Then col.Add fName, fName End If Next fName = Dir DoEvents Loop Debug.Print Format(Timer - t, "0.0000") [c1] = lMax i = 0 For Each x In col i = i + 1 Range("D" & i) = x Next Debug.Print Format(Timer - t1, "0.0000") End Sub
[/vba]
Много читал, ничего не понял. Архив не открывается, но 4 копии файла из №1 обрабатывает за 0,0078 сек (с выгрузкой на лист 0,0117). [vba]
Код
Sub мяв() Dim fName$ Dim i&, lMax& Dim spl, s Dim fso As New FileSystemObject Dim col As New Collection, x Dim t!, t1! t = Timer: t1 = t On Error Resume Next fName = Dir(ThisWorkbook.Path & "\*.txt") Do While fName$ <> "" s = fso.OpenTextFile(fName).ReadAll spl = Split(s, vbCrLf) For i = 0 To UBound(spl) If lMax < Val(Mid(spl(i), 10, 3)) Then lMax = Val(Mid(spl(i), 10, 3)) Set col = New Collection col.Add fName, fName ElseIf lMax = Val(Mid(spl(i), 10, 3)) Then col.Add fName, fName End If Next fName = Dir DoEvents Loop Debug.Print Format(Timer - t, "0.0000") [c1] = lMax i = 0 For Each x In col i = i + 1 Range("D" & i) = x Next Debug.Print Format(Timer - t1, "0.0000") End Sub