Чтение не по одной строке, а сразу по несколько строк

Тема в разделе "WASM.HEAP", создана пользователем Luna, 24 ноя 2010.

  1. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    А если после begin_act в документе нету переносов строки?)
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    KeSqueer
    физически не могу все просматривать) смотрю обычно только те темы, на которые жалобы приходят.
     
  3. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    dZentle_man
    видать вам тоже нужно разбирать акты :)
    конкретизируйте или исходник в студию :)
     
  4. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    Если бы мне было надо - давно бы разобрал) Куда уж конкретней - такую ситуацию вполне можно предусмотреть, только не без гемора. А уж как озаглавливаются начала и концы актов - это к луне.
     
  5. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    решается двумя способами:
    1. регулярными выражениями
    2. синтаксическим анализатором

    1. regular expression
    Код (Text):
    1. if line:match("^ *begin_act[ ]*$") or line:match ("^ *begin_act[ ]+.*",1) then start = true end
    наверно можно и изящней, но я с regex'ами в lua на вы :)

    2. parser
    Код (Text):
    1. кхм... долгая история
     
  6. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    Ага, а Lua для Luna - тоже родной язык, да?) Изящное решение, весьма)


    Ну вот этот вариант я и называл не-без-геморным)
     
  7. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    dZentle_man
    Ну она же Луна, так? Значить родной...
     
  8. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    С такими аргументами сложно спорить...
     
  9. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    У меня тут идея появилась по поводу подсчёта актов . А что если считывать файл построчно в цикле, и внутри цикла поставить условие :
    "если считываемая строка содержит слово "конец_акта", то переменная "количество_актов" инкрементируется"
    Так нормально?
    или слишком просто???)))
     
  10. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    Вполне целесообразно. Правда именно такой функции ни в бейсике, ни в с++ скорее всего нет, так что наверняка эту функцию придется писать ручками. А насчет простоты - простое решение лучше сложного, поэтому всегда нужно стремиться к максимально возможной простоте.
     
  11. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    dZentle_man
    ну не скажите, некоторые люди любят усложнять себе жизнь ))))) ( хех, почему-то вспомнился Том Сойер)

    насчёт функции не уверена, но попробую сделать при помощи InStr ;)
     
  12. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    Некоторые получают удовольствие от боли) Почему-то вспоминается крис касперски)


    Ну попробуйте, может оно и есть) Я ж говорю - я бейсика не знаю, да и в многочисленных фреймворках под плюсы может что-нибудь этакое найтись(теоретически).
     
  13. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    подсчитываем количество актов
    Код (Text):
    1. ...
    2. acts_count = 0 -- сколько актов
    3. ...
    4.         if line:match("^ *конец_акта *$") then
    5.             table.insert(acts, instr); instr = ""
    6.             start = false
    7.             acts_count = acts_count + 1
    8.         end
    9. ...
     
  14. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Руководство по использованию RegEx в VB для чайников, самоваров и самогонных аппаратов

    1. В среде разработки (читаем как IDE), идем в меню Tools->References...
    2. В открывшимся диалоге ищем компонент "Microsoft VBScript Regular Expressions 5.5" и ставим галку (подключаем модуль)
    3. Теперь можно использовать RegEx в VB

    Пример:
    Код (Text):
    1.     Dim rx As New RegExp
    2.     Dim s As String
    3.     s = " end_act "
    4.     rx.Pattern = "^ *end_act *$"
    5.     If rx.Test(s) Then
    6.         ; увеличиваем счетчик актов
    7.     End If
    все шаблоны данные в lua коде актуальны и для VBScript Regular Expression
     
  15. black_hole

    black_hole New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2006
    Сообщения:
    44
    если файл не влезет в кєш диска, он будет будет читаться размером кратнім размеру кєша, а если влезет, то не такой он уж и большой. сериальность|многопочтность чтения зависит от количества головок чтения.
    строчная стратегия существует сейчас только в вашей фантазии:)
     
  16. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    название темы бредовое - обычно читают кусками в буфер - а там уж можно отпарсить что влезло, сдвинуть и подкачать еще данных из файла
     
  17. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Ну в общем- такой вот код получился:
    Код (Text):
    1. Dim retvall
    2. Dim retvalq ' âîçâðàùàåìîå çíà÷åíèå
    3. Dim strA As String
    4. Dim vvv As String
    5.  
    6.  
    7.    
    8.  
    9.  
    10. Private Sub Form_Load()
    11. Form1.BackColor = &HE0E0E0
    12. Form1.Height = 14000
    13. Form1.Width = 16000
    14. End Sub
    15.  
    16.  
    17.  
    18.  
    19. Private Sub Command1_Click()
    20.  
    21. Dim y As Long
    22. Dim F As Long
    23. Dim buffer, retval, rrr
    24. Dim count As Long
    25.  
    26. Static blnprocessing As Boolean
    27. Dim lngct As Long
    28. Dim dbldummy As Double
    29.  
    30.       CommonDialog1.Filter = "Òåêñòîâûå ôàéëû (*.txt) Ôàéëû äàííûõ (*.dat)|*.txt;*.dat"
    31.       CommonDialog1.ShowOpen
    32.       F = FreeFile
    33.  
    34. Text1.Text = " "
    35.  
    36. Text3.Text = " "
    37. Text4.Text = " "
    38. If blnprocessing Then
    39.   blnprocessing = False
    40. Else
    41.   Command1.Caption = "cancel"
    42.   blnprocessing = True
    43.   lngct = 0
    44.  
    45.  
    46.  
    47.   Open CommonDialog1.FileName For Input As #F
    48.   count = 0
    49.  
    50.   Text5.Text = CommonDialog1.FileName
    51.  
    52.   vvv = FileLen(CommonDialog1.FileName) 'Îáú¸ì ôàéëà
    53.   Text4.Text = vvv
    54.   ProgressBar1.Max = vvv + 40
    55.  
    56.  
    57.  
    58.  
    59.    Do While blnprocessing And Not EOF(1)
    60.  
    61.     Line Input #F, txt
    62.      If InStr(1, txt, "idAfterExecute", 1) > 0 Then
    63.         count = count + 1
    64.         Text1.Text = count
    65.     End If
    66.     s1 = s1 + txt + vbCrLf
    67.      Text6.Text = s1
    68.     ProgressBar1.Value = Len(Text6.Text)
    69.    
    70.     retvall = Text2.Text
    71.     retvalq = Split(s1, retvall)
    72.  
    73.   DoEvents
    74.    
    75.   Loop
    76. ProgressBar1.Value = 0
    77.  
    78.   Close #F  'çàêðûòèå ôàéëà
    79.  
    80.  
    81.  
    82.    
    83.    blnprocessing = False
    84.    Command1.Caption = "Îáçîð"
    85.    
    86.  
    87. End If
    88.  
    89.  
    90. End Sub
    91.  
    92. Private Sub Command2_Click()
    93.  
    94.     Text3.Text = "äàííîå ñëîâî âñòðå÷àåòñÿ â òåêñòå" & "  " & UBound(retvalq) & " ðàç"
    95.  
    96.    
    97. End Sub
    Есть, конечно , проблемы:.......при загрузке файла из 60 актов строка прогресса успешно доходит до конца
    а из 1000000 актов- высвечивается только один квадратик строки прогресса.......сижу жду приличное время, больше строка не продвигается
    гм...
     
  18. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    Я гляжу мой совет давать осмысленные имена переменным и функциям вы не восприняли) Ну смотрите сами - будете насиловать читателя - не удивляйтесь что он в ответ изнасилует вас)


    Косяк может быть во многих местах, наиболее важных мест для проверки около четырех-пяти. Например интересно проверить а вообще открылся ли файл, потом проверить чему равна и нормально ли считается переменная count. Проверить также действительно ли при 60 актах програма все считает и выводит правильно - количество count, обновление прогресс-бара. И если нормально, то проверить файлом с большим количеством актов, чем 60, но сильно меньшим чем мильон - например сто, тысяча, 10 тысяч, 100 тысяч. После того, как будет найдено слабое место - можно уже будет думать как его обойти. Как это все тестировать - решать и придумывать вам, это может быть и месседж-бокс, и вывод нужной информации в командную строку, и даже, для особо извращенных, отладчик, но как им пользоваться - это уже отдельная история.
     
  19. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    dZentle_man
    В следующей программе я обязательно учту ваш совет про осмысленные имена ;)

    А ошибку я, как нестранно, нашла..Надо вместо
    ProgressBar1.Value = Len(Text6.Text)
    написать
    ProgressBar1.Value = Len(s1)




    Только вот всплыла новая проблема..Размер текстового поля, оказывается, ограничен, и файл целиком туда не помещается..
    Надо выводить в текстовое поле только акты, которые содержат заданные пользователем слова...Что-т у меня не очень получается это сделать
    Пробовала делать что-то наподобии такого:
    Код (Text):
    1. Do While blnprocessing And Not EOF(1)
    2.  
    3.     Line Input #F, txt
    4.      If InStr(1, txt, "idAfterExecute", 1) > 0 Then
    5.         count = count + 1
    6.         Text1.Text = count
    7.     End If
    8.     s1 = s1 + txt + vbCrLf
    9.  
    10.     ProgressBar1.Value = Len(s1)
    11.     [b]
    12.  If InStr(1, txt, "заданное_слово", 1) > 0 Then
    13.         Text6.Text = s1
    14.  End If
    15. [/b]
    16.     retvall = Text2.Text
    17.     retvalq = Split(s1, retvall)
    18.  
    19.   DoEvents
    20.    
    21.   Loop
     
  20. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    если это vbscript (а похож!), то там точно есть регулярные выражения (RegExp object). Про вижуалбейсик не знаю, но может тоже есть? Выбор из текстового файла только строк, содержащих определенные слова, решается одним регэкспом. Ну и лучше день потерять, потом за 5 минут долететь! (с)