Хотелось бы получить тоже самое но за один проход StringRegExp используя флаг 4.
Но все мои попытки не увенчались успехом
Хотелось бы получить тоже самое но за один проход StringRegExp используя флаг 4.
Но все мои попытки не увенчались успехом
Приведите в пример еще строку, которую Вы тестируете. В слепую делать RegExp невозможноВсё исправил, спасибо
Alarm (Feuer/TAL) \t Grp. 16 bis Grp. 16 \t Stg. 4033; LED HLPT 3.UG
Alarm (Feuer/TAL) \t Grp. 16 bis Grp. 16 \t Stg. 4040; LED HLPT
Alarm (Feuer/TAL) \t Grp. 16 bis Grp. 16 \t Stg. 4077; LED HLPT Melder SD
Alarm (Feuer/TAL) \t Grp. 16 bis Grp. 17 \t Stg. 41; SAA Räumung 3.UG
Alarm (Feuer/TAL) \t Grp. 16 bis Grp. 44 \t Stg. 12; Sammelfeuer an GLT
Alarm (Feuer/TAL) \t Grp. 16 bis Grp. 44 \t Stg. 15; Drehkreuzabschaltung
Alarm (Feuer/TAL) \t Grp. 16 bis Grp. 44 \t Stg. 17; Druckbelüftung
Alarm (Feuer/TAL) \t Grp. 16 bis Grp. 44 \t Stg. 18; Lüftungsabschaltung
Таб, для наглядности я обозначил как \t
Содержание строк может быть и другим, но разделители всегда не изменны: \t для столбцов и \n для строк
#include <Array.au3>
$sChars = FileRead(@ScriptDir & "\1.txt")
$str = StringRegExp($sChars, "(.*?)\t(.*?)\t(.*)", 4)
For $i = 0 To Ubound($str) - 1
_ArrayDisplay($str[$i])
Next
Исходя из этого хотел построить что-то типа такогоВозвращает массив массивов всех совпадений; каждый массив содержит в первом элементе полное совпадение с шаблоном, последующие элементы - совпадение указанных групп (стиль Perl / PHP).
$str=StringRegExp($sChars,"((.*?)\t(.*?)\t(.*)[^\v]+)",4)
Такой двумерный массив как вы хотите Вы не сделаете через RegExp. Вы можете поделить файл на строки через StringSplit, и потом обрабатывать массив.Но это только одномерные массивы, а вот как ММ[x][x] сделать используя эти два выражения я не пойму.
$str=StringRegExp($sChars,"((.*?)\t(.*?)\t(.*)[^\v]+)",4)
#include <File.au3>
#include <Array.au3>
local $array1[0]
local $array2[0]
$hFile = FileOpen("new.txt")
While 1
$sLine = FileReadLine($hFile)
If @error = -1 Then ExitLoop
$str_spl = stringsplit($sLine,'=')
_arrayadd($array1,$str_spl[1])
_arrayadd($array2,$str_spl[2])
WEnd
_ArrayDisplay($array1)
_ArrayDisplay($array2)
FileClose($hFile)
#include <File.au3>
#include <Array.au3>
local $array1[0]
$hFile = FileOpen("new.txt")
While 1
$sLine = FileReadLine($hFile)
If @error = -1 Then ExitLoop
$str_spl = stringsplit($sLine,'делиметр')
_arrayadd($array1,$str_spl[2])
WEnd
_ArrayDisplay($array1)
FileClose($hFile)
$file_fulltxt = fileread($file_istochnik)
$main_arr_spl = stringsplit($file_fulltxt,"|==|",1)
local $arr_cats[1] = ['ыы']
for $kkk = 3 to 9 step 2
$datas_spl = stringsplit($main_arr_spl[$kkk],"----------",1)
for $jjj = 1 to $datas_spl[0]
;~ for $jjj = 1 to 4
$child_datas_spl = stringsplit($datas_spl[$jjj],"=||=",1)
$iUnixTime1 = _GetUnixTime()*1000
$random_dir_numb = random(100000000,999999999,1)
$dirpathimgs = @ScriptDir & "\inetgetfiles\" & $iUnixTime1 & "=" & $random_dir_numb
DirCreate($dirpathimgs)
$line_item_imgs_val = ''
$line_item_imgs = stringsplit($child_datas_spl[1],"|",1)
for $uuu = 1 to $line_item_imgs[0]
if (stringlen($line_item_imgs[$uuu]) > 5) then
$line_item_imgs_spl = stringsplit($line_item_imgs[$uuu],'"',1)
$line_item_imgs_format = stringsplit($line_item_imgs_spl[2],'.',1)
filewriteline($file_inetgets, &&&&&&&&&&&&&&&&&&&&&)
$line_item_imgs_val = $line_item_imgs_val & 'files/' & $iUnixTime1 & "=" & $random_dir_numb & '/' & $uuu & '.' & $line_item_imgs_format[2]
if ($uuu <> $line_item_imgs[0]) then $line_item_imgs_val = $line_item_imgs_val & '|'
EndIf
Next
$line_item_categor = StringRegExpReplace($child_datas_spl[2],'\d','')
$line_item_categor = $main_arr_spl[$kkk-1] & '==' & $line_item_categor
$line_item_categor = StringRegExpReplace($line_item_categor,'\s','@@')
$line_item_name = $child_datas_spl[3]
$line_item_opis = $child_datas_spl[4]
$line_item_cena = StringReplace($child_datas_spl[5],'₽','')
$line_item_cena = StringRegExpReplace($line_item_cena,'\s{1,}','')
$line_item_count = $child_datas_spl[6]
$line_item_location = $child_datas_spl[7]
filewriteline($file_sqlzaprs, &&&&&&&&&&&&&&&&")
$arr_searchcat = _arraysearch($arr_cats, $line_item_categor)
if $arr_searchcat = -1 then
_arrayadd($arr_cats, $line_item_categor)
filewriteline($file_sqlzaprs, $line_item_categor)
EndIf
next
next
Если вы хотите использовать флаг 4 и вам нужен массив массивов тогда читайте справку об "лишних элементах"добавляет два не нужных элемента
Возвращает массив массивов всех совпадений; каждый массив содержит в первом элементе полное совпадение с шаблоном, последующие элементы - совпадение указанных групп (стиль Perl / PHP). |
;~ AutoIt Version: 3.3.14.5
#include <StringConstants.au3>
Local $sData = _
"Alarm (Feuer/TAL)" & @TAB & "Grp. 16 bis Grp. 16" & @TAB & "Stg. 4033; LED HLPT 3.UG" & @CRLF & _
"Alarm (Feuer/TAL)" & @TAB & "Grp. 16 bis Grp. 16" & @TAB & "Stg. 4040; LED HLPT" & @CRLF & _
"Alarm (Feuer/TAL)" & @TAB & "Grp. 16 bis Grp. 16" & @TAB & "Stg. 4077; LED HLPT Melder SD" & @CRLF & _
"Alarm (Feuer/TAL)" & @TAB & "Grp. 16 bis Grp. 17" & @TAB & "Stg. 41; SAA Räumung 3.UG" & @CRLF & _
"Alarm (Feuer/TAL)" & @TAB & "Grp. 16 bis Grp. 44" & @TAB & "Stg. 12; Sammelfeuer an GLT" & @CRLF & _
"Alarm (Feuer/TAL)" & @TAB & "Grp. 16 bis Grp. 44" & @TAB & "Stg. 15; Drehkreuzabschaltung" & @CRLF & _
"Alarm (Feuer/TAL)" & @TAB & "Grp. 16 bis Grp. 44" & @TAB & "Stg. 17; Druckbelüftung" & @CRLF & _
"Alarm (Feuer/TAL)" & @TAB & "Grp. 16 bis Grp. 44" & @TAB & "Stg. 18; Lüftungsabschaltung"
Local $aRegExp = StringRegExp($sData, "(.*?)\t(.*?)\t(.*)", $STR_REGEXPARRAYGLOBALFULLMATCH)
If @error Then Exit @error
Local $aSubRegExp, $sOut
For $i = 0 To UBound($aRegExp) - 1
$aSubRegExp = $aRegExp[$i]
$sOut = ""
For $j = 1 To UBound($aSubRegExp) - 1
$sOut &= StringFormat("%i. %s\r\n", $j, $aSubRegExp[$j])
Next
MsgBox(0, "Пример перебора " & $i, $sOut)
Next
;~ AutoIt Version: 3.3.14.5
#include <StringConstants.au3>
#include <Debug.au3>
Local $sData = _
"Alarm (Feuer/TAL)" & @TAB & "Grp. 16 bis Grp. 16" & @TAB & "Stg. 4033; LED HLPT 3.UG" & @CRLF & _
"Alarm (Feuer/TAL)" & @TAB & "Grp. 16 bis Grp. 16" & @TAB & "Stg. 4040; LED HLPT" & @CRLF & _
"Alarm (Feuer/TAL)" & @TAB & "Grp. 16 bis Grp. 16" & @TAB & "Stg. 4077; LED HLPT Melder SD" & @CRLF & _
"Alarm (Feuer/TAL)" & @TAB & "Grp. 16 bis Grp. 17" & @TAB & "Stg. 41; SAA Räumung 3.UG" & @CRLF & _
"Alarm (Feuer/TAL)" & @TAB & "Grp. 16 bis Grp. 44" & @TAB & "Stg. 12; Sammelfeuer an GLT" & @CRLF & _
"Alarm (Feuer/TAL)" & @TAB & "Grp. 16 bis Grp. 44" & @TAB & "Stg. 15; Drehkreuzabschaltung" & @CRLF & _
"Alarm (Feuer/TAL)" & @TAB & "Grp. 16 bis Grp. 44" & @TAB & "Stg. 17; Druckbelüftung" & @CRLF & _
"Alarm (Feuer/TAL)" & @TAB & "Grp. 16 bis Grp. 44" & @TAB & "Stg. 18; Lüftungsabschaltung"
Local $aRegExp = StringRegExp($sData, "(.*?)\t(.*?)\t(.*)", $STR_REGEXPARRAYGLOBALFULLMATCH)
If @error Then Exit @error
Local $aSubRegExp, $iRows = UBound($aRegExp), $iCols = UBound($aRegExp[0]) - 1, $aOut[$iRows][$iCols]
For $i = 0 To $iRows - 1
$aSubRegExp = $aRegExp[$i]
For $j = 1 To $iCols
$aOut[$i][$j - 1] = $aSubRegExp[$j]
Next
Next
_DebugArrayDisplay($aOut)
Если хотите что бы вам помогли, советую писать по существу, выкладывать код который хотя бы запускается, использовать Tidy и Best coding practices для минимальной читабельностиЯ вот это вот все прочитал, но так и не понял в чем вопрос.
Пример CSV-файла можно?Это обычный CSV-файл ноторый я сначала разбиваю на строки, а потом но столбцы (разделитель TAB)
$sChars = 'Alarm (Feuer/TAL) Grp. 16 bis Grp. 16 Stg. 4033; LED HLPT 3.UG'&@CRLF
$sChars &= 'Alarm (Feuer/TAL) Grp. 16 bis Grp. 16 Stg. 4040; LED HLPT'&@CRLF
$sChars &= 'Alarm (Feuer/TAL) Grp. 16 bis Grp. 16 Stg. 4077; LED HLPT Melder SD'&@CRLF
$sChars &= 'Alarm (Feuer/TAL) Grp. 16 bis Grp. 17 Stg. 41; SAA Raumung 3.UG'&@CRLF
$sChars &= 'Alarm (Feuer/TAL) Grp. 16 bis Grp. 44 Stg. 12; Sammelfeuer an GLT'&@CRLF
$sChars &= 'Alarm (Feuer/TAL) Grp. 16 bis Grp. 44 Stg. 15; Drehkreuzabschaltung'&@CRLF
$sChars &= 'Alarm (Feuer/TAL) Grp. 16 bis Grp. 44 Stg. 17; Druckbeluftung'&@CRLF
$sChars &= 'Alarm (Feuer/TAL) Grp. 16 bis Grp. 44 Stg. 18; Luftungsabschaltung'&@CRLF
$str=StringRegExp($sChars,"([^\t]*)(?:\t*([^\t]*)\t*)(?:\t*([^\n]*)\n)",3)
If Not @error Then
$AllNum = UBound($str)/3
For $a=0 To UBound($str)-3 Step 3
MsgBox(0,'Строка '& ($a+3)/3 & '/'& $AllNum, $str[$a]&@CRLF&$str[$a+1]&@CRLF&$str[$a+2])
Next
EndIf
$sChars = 'Alarm (Feuer/TAL) Grp. 16 bis Grp. 16 Stg. 4033; LED HLPT 3.UG'&@CRLF
$sChars &= 'Alarm (Feuer/TAL) Grp. 16 bis Grp. 16 Stg. 4040; LED HLPT'&@CRLF
$sChars &= 'Alarm (Feuer/TAL) Grp. 16 bis Grp. 16 Stg. 4077; LED HLPT Melder SD'&@CRLF
$sChars &= 'Alarm (Feuer/TAL) Grp. 16 bis Grp. 17 Stg. 41; SAA Raumung 3.UG'&@CRLF
$sChars &= 'Alarm (Feuer/TAL) Grp. 16 bis Grp. 44 Stg. 12; Sammelfeuer an GLT'&@CRLF
$sChars &= 'Alarm (Feuer/TAL) Grp. 16 bis Grp. 44 Stg. 15; Drehkreuzabschaltung'&@CRLF
$sChars &= 'Alarm (Feuer/TAL) Grp. 16 bis Grp. 44 Stg. 17; Druckbeluftung'&@CRLF
$sChars &= 'Alarm (Feuer/TAL) Grp. 16 bis Grp. 44 Stg. 18; Luftungsabschaltung'&@CRLF
$str=StringRegExp($sChars,"(?:([^\t]*)(?:\t*([^\t]*)\t*)(?:\t*([^\n]*)\n))",4)
If Not @error Then
$AllNum = UBound($str)
For $a=0 To UBound($str)-1
$tmp = $str[$a]
MsgBox(0,'Строка '& ($a+1) & '/'& $AllNum, $tmp[1]&@CRLF&$tmp[2]&@CRLF&$tmp[3])
Next
EndIf
Даже и не хотел, зачем мне это.Ну хз, помоему ты придераешься ))
Конечно читал, но формулировку наверное не сразу понял. Лишь сегодня после Вашего сообщения ещё пару раз внимательно прочел и вслед за Вами проверил код от Tempo, который в точности подтвердил это.Если вы хотите использовать флаг 4 и вам нужен массив массивов тогда читайте справку об "лишних элементах"
Перевод сказал(а):К сожалению, вы не можете напрямую обращаться к массивам в массивах "& @CRLF & _
«(не кэшируя их), поэтому я всегда использую флаг 3 вместо флага 4». & @CRLF & _
«Вот все массивы в $ aFlag4:»)
Ну так я вроде все и расписал.Если хотите что бы вам помогли, советую писать по существу, выкладывать код который хотя бы запускается, использовать Tidy и Best coding practices для минимальной читабельности
Проверил Ваш код всё прекрасно работает, но я ошибался по поводу возможностей данной функции, применительно к моему случаю.Пример CSV-файла можно?
готовые решения для превращения CSV в массив
_FileReadToArray() ; чтение в двумерный массив появилось в версии 3.3.12.0
Steuerung abschalten
Angewendet auf: Steuergruppe 15; RWA Haupttreppe
Auslösung: Meldergruppe 99; Abschaltung St.Gr.15 u.16.......................................... gehend
StringRegExp($aSchalt,"(?im)^.+?$(?:\h?\R^Angewendet auf:\h).+d{1,4}/?\d{1,2};.+?(?:\h\R^Auslösung:\h) ).+d{1,4}/?\d{1,2};.+?(?:\.{4,})(kommend|gehend)", 4)
Local $sDat = FileRead("SFunc.txt")
Local $aSchalt = StringRegExpReplace($sDat,"\RAngewendet auf:\h(.+?\d{1,4}/?\d{1,2}?;\h.*?)\h*\RAuslösung:\h(.+?\d{1,4}/?\d{1,2}?;\h.*?)\h?\.{2,}\h?(kommend|gehend)(\h?\R?.*?)",';"\1";"\2";\3'& @CRLF)
MsgBox(0,0,$aSchalt)
При помощи Excel не устроит ?Это обычный CSV-файл ноторый я сначала разбиваю на строки, а потом но столбцы (разделитель TAB)
#include <excel.au3>
#include <array.au3>
$oExcel=_Excel_Open(False)
$oWorkbook=_Excel_BookOpen($oExcel,@ScriptDir&'\1.csv')
$aRange=_Excel_RangeRead($oWorkbook)
_ArrayDisplay($aRange)
Если речь о более раннем вопросе, то там я уже более менее разобрался и прибегать к помощи Excel только усложнит, кроме того, может оказаться, что Excel не будет под рукой.При помощи Excel не устроит ?