|
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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |