F9
Новичок
- Сообщения
- 71
- Репутация
- 2
Добрый день!
Столкнулся с проблемой медленной записи в файл из массива.
Задача такова:
Есть файл File1.txt по сути являющийся файлом CSV, с разделителями в виде ";".
Размер не более 500 Кб
Необходимо выделить столбцы разделенные разделителем, и только некоторые из них (допустим 1,5,4,3 - вставить в файл File2.txt через разделитель @TAB.
Вот как реализовал:
Получилось среднее время выполнения сначала было в районе 400 секунд. После этого исправил косяк в логике работы программы, дабы не повторять одни и теже операции в цикле. Получил результат 230 сек.
И все равно я считаю, что это долго! (Комп не сильно старый, i3 + 4 Гб ОЗУ)
Есть у кого идеи как ускорить работу парсера?
Или так и должно быть? Просто до этого на VBScripte был данный скрипт реализован - там процесс занимал не больше минуты-двух.
Добавлено:
Ах да, забыл... Функцию _StringsStripChars взял с форума.
Вот она:
Столкнулся с проблемой медленной записи в файл из массива.
Задача такова:
Есть файл File1.txt по сути являющийся файлом CSV, с разделителями в виде ";".
Размер не более 500 Кб
Необходимо выделить столбцы разделенные разделителем, и только некоторые из них (допустим 1,5,4,3 - вставить в файл File2.txt через разделитель @TAB.
Вот как реализовал:
Код:
#include <File.au3>
#include <Array.au3>
#include <Zip_UDF.au3>
#include <_StringsStripChars.au3>
global $var = IniReadSection("config.ini", "file_settings")
If @error Then
MsgBox(4096, "", "Ошибка! Не могу найти/прочитать файл настроек INI")
Else
EndIf
$FileFfrom = $var[1][1]
global $var = IniReadSection("config.ini", "mail_settings")
$ID = $var[8][1]
$DestFile = FileOpen($ID & "_" & StringTrimLeft(@YEAR,2) & @MON & @MDAY & ".txt",1+8)
For $i = 1 to _FileCountLines($FileFfrom)
Local $line = FileReadLine($FileFfrom,$i)
If @error = -1 Then ExitLoop
Local $StringPart = StringSplit($line, ";") ;читаем строку по разделителям ";".
;~ Поля для выгрузки:
;~ 1 Наименование товара
;~ Страна производитель товара
;~ 4 Производитель товара
;~ 3 Цена розничная с НП
;~ 2 Остаток товра
;~ Код товара
;~ Срок годности
FileWrite($DestFile,_StringStripChars($StringPart[1],"/\min" & CHR(034) & CHR(039),3,0,1) & @TAB & $StringPart[5] & @TAB & $StringPart[4] & @TAB & $StringPart[3] &@CR)
Next
FileClose($FileFfrom)
FileClose($DestFile)
Получилось среднее время выполнения сначала было в районе 400 секунд. После этого исправил косяк в логике работы программы, дабы не повторять одни и теже операции в цикле. Получил результат 230 сек.
И все равно я считаю, что это долго! (Комп не сильно старый, i3 + 4 Гб ОЗУ)
Есть у кого идеи как ускорить работу парсера?
Или так и должно быть? Просто до этого на VBScripte был данный скрипт реализован - там процесс занимал не больше минуты-двух.
Добавлено:
Сообщение автоматически объединено:
Ах да, забыл... Функцию _StringsStripChars взял с форума.
Вот она:
Код:
;;===============================================================================
; Название функции: _StringStripChars()
; Описание: Очистка (удаление/опщипывание) определённых символов в строке.
;
; Параметры: $sString - Строка для обработки.
; $sSubString - Символы (подстрока) которые следует удалять.
; $iFlag [Опц.] - Определяет поведение процесса опщипывания (см. Возвращаемое значение).
; $iCount [Опц.] - Определяет количество удалений указанных символов в $sSubString (см. Возвращаемое значение).
; $iGroupChars [Опц.] - Если этот параметр равен 1 (по умолчанию 0), то все символы в $sSubString группируются и удаляются по отдельности.
;
; Требования: AutoIt 3.2.8.1 +
;
; Возвращаемое значение: При успешной обработке - Возвращает новую строку после удаления символов в соответствии с флагами $iFlag и $iCount:
; $iFlag = 0 (по умолчанию) - замена символов по всей строке - с этим флагом @extended будет содержать число произведённых замен в строке.
; $iFlag = 1 - замена символов с левой стороны у строки.
; $iFlag = 2 - замена символов с правой стороны у строки.
; $iFlag = 3 - замена символов с обеих сторон у строки.
;
; $iCount = 0 (по умолчанию) - замена всех вхождении символов указанных в $sSubString.
; $iCount > 0 - замена N-ое число (указанное в $iCount) вхождении символов $sSubString.
;
; При неудачной обработке - Если длина указанной строки равняется нулю (0), то @error устанавливается на 1 и возвращается $sString.
;
; Автор(ы): amel27, Мод. от G.Sandler a.k.a MsCreatoR
;===============================================================================
Func _StringStripChars($sString, $sSubString, $iFlag = 0, $iCount = 0, $iGroupChars = 0)
If StringLen($sString) = 0 Then Return SetError(1, 0, $sString)
Local $sGroupChar_a = '(', $sGroupChar_b = ')'
If $iCount < 0 Then Local $sGroupChar_a = '[', $sGroupChar_b = ']'
$sSubString = StringRegExpReplace($sSubString, '([][{}()|.?+*\\^\$])', '\\\1')
If $iGroupChars = 1 Then $sSubString = '[' & $sSubString & ']'
Local $sPattern = '(?i)' & $sGroupChar_a & $sSubString & $sGroupChar_b
Local $sPattern_Count = '{1,' & $iCount & '}'
If $iCount <= 0 Then $sPattern_Count = '+'
If $iFlag <> 0 Then $iCount = 0
If $iFlag = 1 Then $sPattern = '(?i)^' & $sGroupChar_a & $sSubString & $sGroupChar_b & $sPattern_Count
If $iFlag = 2 Then $sPattern = '(?i)' & $sGroupChar_a & $sSubString & $sGroupChar_b & $sPattern_Count & '$'
If $iFlag = 3 Then $sPattern = '(?i)^' & $sGroupChar_a & $sSubString & $sGroupChar_b & $sPattern_Count & '|' & _
$sGroupChar_a & $sSubString & $sGroupChar_b & $sPattern_Count & '$'
$sString = StringRegExpReplace($sString, $sPattern, '', $iCount)
Return SetExtended(@extended, $sString)
EndFunc