|   |   | 
| 
 | v7: Склеить много текстовых файлов, быстро | ☑ | ||
|---|---|---|---|---|
| 0
    
        Злопчинский 17.11.23✎ 11:24 | 
        Есть много текстовых файликов ~несколько тысяч (от десятков килобайт до десятков мегабайт). Хочется склеить их в один текстовый файл... Штатно 1Ска хренячит все это медленно,
 как-то должно быть быстро через fso.. Однако навскиду fso нашел тоже построчно, есть ReadALL для чтения, но как это в вывод запихнуть непонятно, кск сделать, чтобы быстро файлики склеить? . исходный код ТекущийКаталог = ФС.ТекКаталог(); ФС.УстТекКаталог(ВыбКаталог); Тлог = СоздатьОбъект("Текст"); сч = 0; ИмяФайла = ФС.НайтиПервыйФайл("~*.tmp"); Пока ПустаяСтрока(ИмяФайла) = 0 Цикл сч = сч + 1; Состояние("ждите... "+Формат(сч,"Ч(0)5")+" часть протокола: "+ИмяФайла); Тчасть = ""; Тчасть = СоздатьОбъект("Текст"); Тчасть.Открыть(ВыбКаталог+ИмяФайла); КС = Тчасть.КоличествоСтрок(); Для ы = 1 По КС Цикл Тлог.ДобавитьСтроку(Тчасть.ПолучитьСтроку(ы)); КонецЦикла; Тчасть = ""; ИмяФайла = ФС.НайтиСледующийФайл(); КонецЦикла; ФС.УстТекКаталог(ТекущийКаталог); Состояние(""); | |||
| 1
    
        maxab72 17.11.23✎ 11:26 | 
        Через команды системы не пробовали? Чтоб сама ОС их соединяла?     | |||
| 2
    
        vde69 17.11.23✎ 11:36 | 
        copy /A имя1+имя2+имя3 /A итоговое_имя     | |||
| 3
    
        DJ Anthon 17.11.23✎ 11:36 | 
        copy *.txt all.txt     | |||
| 4
    
        vde69 17.11.23✎ 11:38 | 
        (3) в каком порядке будет результат?     | |||
| 5
    
        Chai Nic 17.11.23✎ 11:39 | 
        (4) Скорее всего в том порядке, в каком ОС выдает файлы функции FindNext     | |||
| 6
    
        Kigo_Kigo 17.11.23✎ 11:52 | 
        (2) + Командную строку склеить в 1С, и КомандаСистемы(<СтрокаКоманды>)     | |||
| 7
    
        DJ Anthon 17.11.23✎ 12:01 | 
        (4) команда copy осилит несколько тысяч файлов через плюсик?     | |||
| 8
    
        maxab72 17.11.23✎ 12:03 | 
        (7) можно copy в цикле запустить     | |||
| 9
    
        Злопчинский 17.11.23✎ 12:07 | 
        Про Copy я думал, но не сильно красиво, придется командную строку длинной не делать     | |||
| 10
    
        lodger 17.11.23✎ 12:11 | 
        (9) если всё и так лежит в одной куче, то copy /b *.txt combined.txt     | |||
| 11
    
        Злопчинский 17.11.23✎ 12:13 | 
        (3) так получается быстро, но порядок склейки немного не тот что дает 1Сный код     | |||
| 12
    
        Злопчинский 17.11.23✎ 12:13 | 
        (10) см.11     | |||
| 13
    
        bolobol 17.11.23✎ 12:14 | 
        Должен быть ключ указывающий текстовый файл с путями к файлам копирования     | |||
| 14
    
        Злопчинский 17.11.23✎ 12:18 | 
        можно попробовать, конечно, в 1сном цикле
 copy uuu.tmp >> all.txt как-то так с двонйм скобкой было... | |||
| 15
    
        AAA 17.11.23✎ 15:25 | 
        (0)не понял что значит "как впихнуть". Прочитали ReadAll и пишите во итоговый файл. Или я просто не вьехал?     | |||
| 16
    
        mikecool 17.11.23✎ 15:27 | 
        (0) а если Состояние() убрать, не быстрее ли будет
 кажется это был один из тормозов системы | |||
| 17
    
        Garykom гуру 17.11.23✎ 15:36 | 
        (0) создай из 1С батник с именами файлов и запусти его
 copy /b All.txt + file1.txt All.txt copy /b All.txt + file2.txt All.txt ... | |||
| 18
    
        Злопчинский 17.11.23✎ 18:23 | 
        (16) состояние вообще роли не играет, тормозит построчная чтение-перезапись     | |||
| 19
    
        Sserj 17.11.23✎ 19:40 | 
        А можно что-то новенькое попробовать к примеру через Powershell:
 КомандаСистемы("powershell ""Get-Content D:\?.txt | Out-File D:\all.txt"""); | |||
| 20
    
        Злопчинский 17.11.23✎ 19:58 | 
        (19) чтото я вангую - будет как в 11     | |||
| 21
    
        H A D G E H O G s 17.11.23✎ 20:10 | 
        ФайлДляЗаписи = СоздатьОбъект("AddIn.V7TextFile");
 ИмяФайлаЗаписи = СокрЛП(ИмяКаталога) + "\parts.csv"; ФайлДляЗаписи.ОткрытьФайл(ИмяФайлаЗаписи, 1); ФайлДляЗаписи.РазмерБуфера(30000000); Для Сч=1 По 1000000 Цикл ФайлДляЗаписи.ЗаписатьСтроку(Данные); КонецЦикла; ФайлДляЗаписи.ЗакрытьФайл(); | |||
| 22
    
        H A D G E H O G s 17.11.23✎ 20:11 | 
        Как вы только в 7.7 что то пишите     | |||
| 23
    
        Sserj 17.11.23✎ 20:20 | 
        (20) Ну тут свободы поболее. Файлы можно и отсортировать как хочешь. Взять все текстовые файлы, отсортировать по дате создания в обратном порядке и записать в итоговый:
 Get-ChildItem -Path D:\ *.txt | Sort-Object CreationTime -Descending | Get-Content | Out-File D:\Combined.txt | |||
| 24
    
        Dimasik2007 17.11.23✎ 20:24 | 
        Если можно использовать Powershell, то можно сделать типа так (в $orderFilePath некий текстовичок, где можно указать последовательность файлов)
 # Получаем содержимое входных параметров $directoryPath = "путь_к_каталогу_с_текстовыми_файлами" $orderFilePath = "путь_к_файлу_с_порядком" $outputFilePath = "путь_к_результирующему_файлу" # Получаем список файлов и фильтруем только .txt файлы $files = Get-ChildItem -Path $directoryPath -Filter *.txt # Читаем порядок из файла $order = Get-Content -Path $orderFilePath # Создаем результирующий файл и записываем в него содержимое файлов в указанном порядке foreach ($file in $order) { $fileContent = Get-Content -Path ($directoryPath + "\" + $file) Add-Content -Path $outputFilePath -Value $fileContent } | |||
| 25
    
        Злопчинский 17.11.23✎ 22:09 | 
        (22) Культурно изподвыпер... ну короче, ты понял.. ;-)     | |||
| 26
    
        Djelf 17.11.23✎ 22:21 | 
        А потом возможно будет такой вопрос: "Я слил 100500 текстовых файлов в один, но забыл их наименования проставить, как теперь из этого мегафайла распарсить их в одиночные файлы?".
 (0) Без обид! ;) В чем смысл то? Может их проще стереть нахрен... Объясняй понятнее. Нахрена тебе это надо? | |||
| 27
    
        Злопчинский 17.11.23✎ 22:33 | 
        это тупо части лога мутного расчета, скидываются в файло в клчевых точках. Это тупо все отладочная инфа, чтобы при разборе проблемной ситуации посмотреть что как васистдас...     | |||
| 28
    
        Злопчинский 17.11.23✎ 22:50 | 
        заказ мутный до безобразия, да еще и с непредсказуемым результатом...     | |||
| 29
    
        AAA 18.11.23✎ 05:19 | 
        Если это какие то логи и они будут нужны. то надо делать систему управления ими. Завести справочник, писать в него имя файла лога и иную информацию, в зависимости от специфики этого расчета. Если уж делать, то делать     | |||
| 30
    
        AAA 18.11.23✎ 10:20 | 
        а если уж так сильно надо склеить, то почему сразу не пишется в один файл, почему в разные ?)     | |||
| 31
    
        NorthWind 18.11.23✎ 11:32 | 
        (0) через ADODB.Stream'ы может быть? Строками какашка будет по скорости, нужно чтобы был механизм блочного чтения-записи. Это только стримы умеют.     | |||
| 32
    
        NorthWind 18.11.23✎ 11:33 | 
        + (31) ну или на другом языке делать. На питоне, например.     | |||
| 33
    
        Djelf 18.11.23✎ 13:19 | 
        (27) Может тебе все таки на sqlite стоит перевести логи?
 То что в 1с 8.3 это не взлетело было немного ожидаемо, но логи в 7ке можно разносить по пользователям, т.е. 0% блокировок, скорость записи вполне достаточная для логов, а анализ в 100 раз круче, чем текст парасить. | |||
| 34
    
        Злопчинский 18.11.23✎ 13:34 | 
        (29) не надо, разовый заказ, разовая работа.
 сократил вывод в логи, стало обрабатываться вполне приемлемо, ~1900 файлов штатным кодом 1С-ки. Тупит, когда части логов большого объема | |||
| 35
    
        ЯнСмит 18.11.23✎ 13:43 | 
        (33) "логи в 7ке можно разносить по пользователям" - ого а можно поподробнее развить эту тему?     | |||
| 36
    
        AAA 18.11.23✎ 14:17 | 
        (35)в 7ке можно вообще все ))     | |||
| 37
    
        Djelf 18.11.23✎ 14:30 | 
        (35) Так на 1sqlite все фантазии реализуются, лог отдельной обработки, лог каждого пользователя отдельно и т.д. и т.п.
 Можно перехватчик из 1с++ использовать и там с обычным журналом истории творить чудеса (без надобности было, но так тоже можно). Я обычно лог/трассировку конкретной обработки делаю, но тоже не часто. Если обработка вышла в продакшен, то в ней ошибок нет! А если есть, то "вы ее не правильно используете" ;) Можно и на более продвинутой БД все это сделать, но зачем? (34) Вот "Тупит, когда части логов большого объема"! Надо на sql переводитьт логи, один раз напишешь процедеру своего логгера и забудешь про эти проблемы. | |||
| 38
    
        Злопчинский 18.11.23✎ 15:23 | 
        (36) Точняк! и даже больше!     | |||
| 39
    
        Злопчинский 18.11.23✎ 15:37 | 
        (37) да нафиг не нужны эти логи потом после этой задачи.
 просто задача для моего просевшего организма сложноватой оказалась, и на тестовых прогонах ломалось,пришлось логировать генерацию данных, чтобы понять почему вот здесь "А".. а понять можно только по предыстории развития ситуации... а эту историю можно только по логам понять... . я вот когда WMS-ку на 77 писал, так для планирования заказов пришлось тоже все подробно и красиво логировать, там это хоть действительно полезно было ... | |||
| 40
    
        Aleksey 18.11.23✎ 16:03 | 
        (30) потому что генерация большого файла в 7-ке на порядок дольше чем генерация мелких с последующей склейкой.     | |||
| 41
    
        AAA 18.11.23✎ 18:26 | 
        (40)Это объект Текст так работает, он умирает на больших объемах. FSO работает гораздо лучше. Там есть проблема, но скорее не большого файла, а большой порции     | |||
| 42
    
        ЯнСмит 18.11.23✎ 21:09 | 
        (41) стесняюсь спросить, а FSO это что такое? (что такое ФСО я в курсе =))     | |||
| 43
    
        Волшебник 18.11.23✎ 21:22 | 
        (42) FSO - File System Object, объект для доступа к файловой системе из скрипта Basic     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |