Что нового

Разобрать файл на строки и проверить структуру

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Есть текстовый файл с такой структурой:
Код:
1 строка
2 строка
3 строка
4 строка
5 строка

7 строка
8 строка
9 строка
10 строка
11 строка

Видно что строки с 1 по 5 и 7 по 11 идут неразрывно, т.е между ними нету пустой строчки. Такая структура правильная. 5 обязательных строк 1 пустая (используется как разделитель).

Как теперь проверить правильность такого файла и составить массив вида:
Код:
[0] = 2
[1] = 1 строка
[2] = 2 строка
[3] = 3 строка
[4] = 4 строка
[5] = 5 строка
[6] = 7 строка
[7] = 8 строка
[8] = 9 строка
[9] = 10 строка
[10] = 11 строка

Где 0 элемент - содержит количество правильных "блоков"

Вот пример неправильных файлов:
Код:
1 строка

3 строка
или
Код:
1 строка
2 строка
3 строка
4 строка
5 строка
6 строка

или в файле который представлен ниже, в массив должно папасть только "правильный блок" т.е строки с 1 по 5
Код:
1 строка
2 строка
3 строка
4 строка
5 строка

7 строка

Не могу решить эту задачу.. :stars: Крыша уже едит
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А если так? Что должно попасть в массив?

Код:
1 строка
2 строка
3 строка
4 строка
5 строка

6 строка
7 строка
8 строка
9 строка

10 строка
11 строка
12 строка
13 строка
14 строка

15 строка
16 строка
17 строка
18 строка
19 строка
20 строка
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Только 1 по 5. Т.к остальные строки не стоят на своих местах..
Начало блоков должно начинаться со следующий строк
Код:
1
7
13
19
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
inververs
Попробуйте так
Код:
#include <Array.au3>

$hFile = FileOpen('test.txt', 0)
If $hFile = -1 Then
    MsgBox(0, "Error", "Файл не найден!")
    Exit
EndIf

Dim $aArray[1000], $i = 1

While 1

    If $i = UBound($aArray) Then ReDim $aArray[UBound($aArray)+1000]

    Local $sLine = FileReadLine($hFile)
    If @error = -1 Then 
		If Not Mod($i, 6) Then 
			$aArray[0] += 1
			ExitLoop
		Else
			ConsoleWrite('-> Файл не соответствует стандарту' & @CR)
			$aArray = 0
			ExitLoop
		EndIf
	EndIf
	
    If Not $sLine Then
		If  Mod($i, 6) <> 0 Then 
			ConsoleWrite('-> Файл не соответствует стандарту' & @CR)
			$aArray = 0
			ExitLoop
		EndIf
		If Not Mod($i, 6) Then $aArray[0] += 1
	Else
		$aArray[$i] = $sLine
	EndIf

	$i += 1
WEnd

If IsArray($aArray) Then ReDim $aArray[$i]
	
_ArrayDisplay($aArray)

FileClose($hFile)
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Garrett
Спасибо за пример, только он очень котегоричный, если не соответствует стандарту то массив не формируется вообще, даже если в начале файла (или в середине) есть правильные блоки

Например, бракует такой файл:
Код:
ааа
ббб
ввв
ггг
ддд

еее
жжж
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
inververs

Код:
#include <Array.au3>

$hFile = FileOpen('test.txt', 0)
If $hFile = -1 Then
    MsgBox(0, "Error", "Файл не найден!")
    Exit
EndIf

Dim $aArray[1000], $i = 1, $sLine

While 1
	
	If  $i = UBound($aArray) Then ReDim $aArray[UBound($aArray)+1000]
		
    $sLine = FileReadLine($hFile)
    If @error = -1 Then
		If Not Mod($i, 6) Then
			$aArray[0] += 1
		EndIf
		ExitLoop
	EndIf
	
    If $sLine Then
		$aArray[$i] = $sLine
	Else
		
		If Mod($i, 6) <> 0 Then
			If $i < 6 Then $aArray = 0
			ExitLoop
		Else
			$aArray[0] += 1
		EndIf
	EndIf
	$i += 1
WEnd

If IsArray($aArray) Then ReDim $aArray[$aArray[0] * 6]
	
_ArrayDisplay($aArray)
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Спасибо, Garrett
Паралельно я сделал вот так:
Код:
#include <array.au3>

Global $aADS[500] ;Для одной компании 100 объявлений
Global $iADSCounter = 1
Global $iADSCompany = 0
Global $iGroupCount = 0

$sFile = "ads.txt"
$aData = StringSplit(FileRead($sFile) & @CRLF, @CRLF, 1) ;+ Добавляем пустую строку

For $i = 1 To $aData[0] Step 6
	ConsoleWrite("Проверяем блок: " & $i & "-" & $i + 4 & @LF)

	If ($i + 5 > $aData[0]) _					;Номер пустой строки в конеце блока выходит за диапазон количества строк в файле
			Or ($aData[$i + 5]) _				;Нету строки разделителя (Пустой строки)
			Or ($i > 1 And $aData[$i - 1]) _	;Предыдущяя строка от начала блока не пустая (не разделитель) за исключением первой строки
			Or (Not $aData[$i + 0]) _			;Первый элемент блока пустой
			Or (Not $aData[$i + 1]) _			;Второй элемент блока пустой
			Or (Not $aData[$i + 2]) _			;Третий элемент блока пустой
			Or (Not $aData[$i + 3]) _			;Четверый элемент блока пустой
			Or (Not $aData[$i + 4]) _			;Пятый элемент блока пустой
			Then ContinueLoop 					;Продолжаем цикл,т.к блок не является валидным.
ConsoleWrite("+Правильный" & @LF)
	$iGroupCount += 1
	$aADS[$iADSCounter + 0] = $aData[$i + 0]
	$aADS[$iADSCounter + 1] = $aData[$i + 1]
	$aADS[$iADSCounter + 2] = $aData[$i + 2]
	$aADS[$iADSCounter + 3] = $aData[$i + 3]
	$aADS[$iADSCounter + 4] = $aData[$i + 4]
	$iADSCounter += 5
Next

ReDim $aADS[$iADSCounter]
$aADS[0] = $iGroupCount
_ArrayDisplay($aADS)
 
Верх