Имя: Пароль:
1C
 
Как победить RegExp при большом объеме файла?
0 Arta
 
25.02.06
21:17
Есть  несколько логов, которые надо подготовить для запроса через ODBC как csv. Для этого мне надо любое количество пробелов заменить на один сивол ";"
1С-вскими методами долго, попробовал рег.выражениями, но на больших файлах валится, если загнать в Replace файл полностью. Как разбить файл на определенное кол-во строк? Если построчно, то опять же долго...

RegExp = СоздатьОбъект("VBScript.RegExp");
RegExp.IgnoreCase= 1;
RegExp.Global = 1;
RegExp.Multiline = 1;
RegExp.Pattern = "\x20+";

FSO = СоздатьОбъект("Scripting.FileSystemObject");
TextStream2 = FSO.CreateTextFile("C:\Temp\Результат.csv", -1, 0);
TextStream2.WriteLine("F1;F2;F3;F4;F5;F6;F7;F8;F9;F10");
Файл = ФС.НайтиПервыйФайл("C:\Temp\access.log" + "*");
Пока Файл <> "" Цикл
   File = FSO.GetFile("C:\Temp\Squid\" + Файл);
   TextStream1 = File.OpenAsTextStream(1, 0);

   Стр = TextStream1.ReadAll();
   Стр = RegExp.Replace(Стр, ";"); // Срубается именно тут :(
   TextStream2.Write(Стр);

   Состояние("Идет обработка файла - " + Файл);

   TextStream1.Close();
       Файл = ФС.НайтиСледующийФайл();
КонецЦикла;
TextStream2.Close();
1 Волшебник
 
модератор
25.02.06
21:19
Загрузи файл в какую-нибудь базу и работай с ним.
2 ШтушаКутуша
 
25.02.06
21:22
используй возможности Excel
3 Arta
 
25.02.06
21:33
(1) Для этого и перевожу в csv, чтобы загрузить :)
А так это просто файлы не имеющие разделителей, и строгих привязок по позиции столбца.

(2) Excel - таже история, ему нужны либо разделители, либо строгая длина колонки
4 romix
 
25.02.06
22:19
(0) Как насчет метода СтрЗаменить()?
5 Arta
 
25.02.06
22:21
(4)Придется писать
СтрЗаменить(Стр, "       ", ";")
СтрЗаменить(Стр, "      ", ";")
СтрЗаменить(Стр, "     ", ";")
СтрЗаменить(Стр, "    ", ";")
СтрЗаменить(Стр, "   ", ";")
СтрЗаменить(Стр, "  ", ";")
СтрЗаменить(Стр, " ", ";")

:) И... Это долго, сам же знаешь что FSO рулит
6 romix
 
модератор
25.02.06
22:22
Сначала заменяй 3 пробела на 2 (столько раз, чтобы исчезли все вхождения 3 и более пробелов).  Потом заменяй 2 пробела на ;

Вообще, ексель умеет читать текст, размеченый в стиле таблиц для MS-DOS
(когда выравнивание - пробелами), как таблицу.  Посмотри там импорт. Чего только нет...
7 ШтушаКутуша
 
25.02.06
22:29
и включи заполнять св-ва файлов: Сервис->Параметры->Общие->Предлагат заполнение св-в файлов
8 Arta
 
25.02.06
22:31
(6) Нету выравнивания, там + несколько пробелов после каждой колонки. Длина колонки разная. :(

Лана... сейчас придумаю что ни то.
9 insider
 
25.02.06
22:46
(0) СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СокрЛП(ВыбСтр),"  ",";"),";;",";"),";;",";")," ","");
10 romix
 
модератор
25.02.06
23:11
(9) Не ругайся 7-этажными выражениями в скобках :-)
Это можно сделать итерационно:


Пока Найти(стр,"  ")>0 Цикл
 стр=СтрЗаменить(стр, "   ","  ");
КонецЦикла;
стр=СтрЗаменить("  ", ";");
11 insider
 
25.02.06
23:14
(10) нафиг развлекать проц лишними итерациями, твой вариант имхо на большом числе строк будет тормозить.
все, ждем NS, пусть рассудит :)
12 insider
 
25.02.06
23:18
(11) есть у меня слабость, хотел решить оптимально, желательно в одну строку, правда пару минут соображал, что не так :)
AdBlock убивает бесплатный контент. 1Сергей