Имя: Пароль:
1C
1C 7.7
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
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший