Автор Тема: Разобрать файл на строки и проверить структуру  (Прочитано 3881 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 462
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Есть текстовый файл с такой структурой:
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: Крыша уже едит

Русское сообщество AutoIt


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
А если так? Что должно попасть в массив?

1 строка
2 строка
3 строка
4 строка
5 строка

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

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

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


Думай, прежде чем говорить.

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135

  • Автор темы
  • Репутация: 462
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Только 1 по 5. Т.к остальные строки не стоят на своих местах..
Начало блоков должно начинаться со следующий строк
1
7
13
19

Русское сообщество AutoIt

Re: Разобрать файл на строки и проверить структуру
« Ответ #2 Отправлен: Июнь 02, 2012, 21:10:28 »

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 963
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
inververs
Попробуйте так
Код: AutoIt [Выделить]
#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 [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135

  • Автор темы
  • Репутация: 462
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Garrett
Спасибо за пример, только он очень котегоричный, если не соответствует стандарту то массив не формируется вообще, даже если в начале файла (или в середине) есть правильные блоки

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

еее
жжж

Русское сообщество AutoIt

Re: Разобрать файл на строки и проверить структуру
« Ответ #4 Отправлен: Июнь 02, 2012, 22:13:34 »

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 963
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
inververs

Код: AutoIt [Выделить]
#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 [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135

  • Автор темы
  • Репутация: 462
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Спасибо, Garrett
Паралельно я сделал вот так:
Код: AutoIt [Выделить]
#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)


Русское сообщество AutoIt

Re: Разобрать файл на строки и проверить структуру
« Ответ #6 Отправлен: Июнь 03, 2012, 13:19:03 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
1 Ответов
3399 Просмотров
Последний ответ Ноябрь 26, 2009, 04:42:05
от Yashied
2 Ответов
2478 Просмотров
Последний ответ Февраль 25, 2012, 21:32:39
от Afonichev
11 Ответов
5980 Просмотров
Последний ответ Август 15, 2012, 16:23:53
от AZJIO
8 Ответов
4060 Просмотров
Последний ответ Июнь 10, 2013, 17:10:35
от Yashied
3 Ответов
1571 Просмотров
Последний ответ Май 14, 2015, 12:33:50
от firex
2 Ответов
1105 Просмотров
Последний ответ Июнь 28, 2015, 06:40:45
от Zalman1980
3 Ответов
2912 Просмотров
Последний ответ Август 12, 2015, 14:27:03
от w13
10 Ответов
3215 Просмотров
Последний ответ Август 21, 2015, 19:10:21
от alex33
10 Ответов
3380 Просмотров
Последний ответ Октябрь 22, 2016, 15:09:46
от Cthulhu
6 Ответов
1488 Просмотров
Последний ответ Сентябрь 09, 2016, 07:23:57
от badhabit