Author Topic: Чтение файла txt больше 100 метров, как ускорить процесс ?  (Read 3096 times)

0 Members and 1 Guest are viewing this topic.

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Поискал сейчас тоже программу для нарезки файлов по количеству строк. Нашел Text Cleaver. Похоже речь именно о нем. Так вот, он не совсем удобно переименовывает файлы.

Вот в таком порядке их сортирует Clickermann (и это правильно):
add1.txt
add10.txt
add11.txt
...
add19.txt
add2.txt

Проводник Windows сортирует по другой логике.

После нарезки файлов их можно просто все переименовать:
1. Сортировка в Проводнике - в алфавитном порядке, по возрастанию
2. Выделить все файлы - Ctrl + A
3. Правый клик на первом файле, и выбрать "Переименовать"
4. Удалить имя совсем, или написать свое
5. Enter
Так Clickermann будет их обрабатывать в том же порядке, в котором они отображаются в Проводнике.

Строки в файлах скрипт перебирает по порядку - с первой строки и до последней.
Но у нас в цикле условие: FOR ($i = 1, (($i < 150) & ($i < $count)))
Это указывает кликеру читать файлы с первой строки, по очереди, без пропусков, пока не будут прочитаны все строки файла, или пока количество прочитанных строк не превысит 150.
То есть сейчас, в каждом файле скрипт обрабатывает максимум 150 строк, а затем переходит к следующему файлу. Так задумано? Или это ошибка?

Вот переделанный скрипт, с удалением обработанных файлов.
Чтобы не заморачиваться с путями к файлам и не терять скорость на лишних действиях, скрипт помещаем в папку с файлами.

Code: (clickermann) [Select]
// Этот скрипт положить в папку с обрабатываемыми им файлами
LOGCLEAR

GETFILELIST($arr, "*.txt") // список всех *.txt файлов в папке

FOR($n = 0, $n < ARRSIZE($arr))
   
   $file = $arr[$n]
   
   FOR ($a=0, $a<1)    // 1 кусок цикла
     
      WAITMS(10)
      LCLICK(1011,360)
     
   END_CYC
   
   LCLICK(344,705)
   
   $count = TFCOUNT($file) + 1 // количество строк в файле
   
   FOR ($i = 1, (($i < 150) & ($i < $count))) // 2 кусок
     
      $b = TFREAD($file, $i)
     
      TOCLIP(STRCONCAT("Привет ", $b))
     
      KEYDOWN(#CTRL)
      KEYPRESS(#V)
      KEYUP(#CTRL)
     
      KEYPRESS(#ENTER)
      WAITMS(5)
     
      // INC($num) // количество обработанных строк
     
   END_CYC
   
   INC($num,$i) // количество обработанных строк, по окончании обработки фала
   
   TFCLEAR($file, 1) // удаление обработанного файла с диска (мимо корзины)
   
END_CYC

SETTHREAD (log, 0) // когда все файлы обработаны - остановить поток "log"
LOGWRITE ("Всего бработано строк: ", $num) // вывод в лог последней статистики

THREAD(name, 1)
   WAIT(1) // частота вывода в лог
   LOGCLEAR // чтобы лог не разрастался
   LOGWRITE ("В обработке файл: ", $file) // вывод в лог
   LOGWRITE ("Обработано строк: ", $num)
END_THREAD

HALT

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Проблема с сортировкой оказалась всё еще актуальной :-\.
По моему, можно ничего с этим не делать.))

stadon

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Code: (clickermann) [Select]
GETFILELIST($arr, "C:\papka\*.txt") // список всех *.txt файлов в папке "C:\papka\"

FOR($n = 0, $n < ARRSIZE($arr))
   
   $file = $arr[$n]
   
   FOR ($a=0, $a<1)    // 1 кусок цикла
     
      WAITMS(10)
      LCLICK(1011,360)
     
   END_CYC
   
   LCLICK(344,705)
   
   $count = TFCOUNT($file) + 1 // количество строк в файле
   
   FOR ($i = 1, (($i < 150) & ($i < $count))) // 2 кусок
     
      $b = TFREAD($file, $i)
     
      TOCLIP(STRCONCAT("Привет ", $b))
     
      KEYDOWN(#CTRL)
      KEYPRESS(#V)
      KEYUP(#CTRL)
     
      KEYPRESS(#ENTER)
      WAITMS(5)
     
      INC($num) // количество обработанных строк
     
   END_CYC
   
   // INC($num,$i) // количество обработанных строк, по окончании обработки фала
   
END_CYC

SETTHREAD (log, 0) // когда все файлы обработаны - остановить поток "log"
LOGWRITE ("Всего бработано строк: ", $num) // вывод в лог последней статистики

THREAD(name, 1)
   WAIT(1) // частота вывода в лог
   LOGCLEAR // чтобы лог не разрастался
   LOGWRITE ("В обработке файл: ", $file) // вывод в лог
   LOGWRITE ("Обработано строк: ", $num)
END_THREAD

HALT

Скрипт просканирует папку на наличие txt-фалов и будет обрабатывать их по порядку.
Количество обработанных строк стакается в переменную $num, в строке 31. Можно эту строку закомментировать и активировать строку 35. Но одна из них должна быть закомментирована, или удалена. Когда работает строка 35, экономия времени больше.
В 1 строке скрипта нужно прописать свой путь к папке с txt-фалами (полный или относительный), отмечено красным.
GETFILELIST($arr, "C:\papka\*.txt") // список всех *.txt файлов в папке "C:\papka\"
Вроде всё)

Спасибо большое добрый человек! :)
Все работает как ракета, потестил оба варианта, просто пушка )
Удачи и добра! 8)

Что то пошло не так ( :'(
Сегодня выходной ... Немного присмотрелся, увидел что то-то не так, решил закинуть в папку буфера (GETFILELIST($arr, "C:\papka\*.txt")) 2 txt файла на 500 и 2000 строк. Запустил скрипт и понял что он не остановился на "количество обработаных строк 2600+ ", понял что он читает рандомом файлы и строки (

Как сделать что бы он работал по порядку начиная с 1.txt +1... 10.txt и так же шел по строкам в каждом файле ? Или даже просто после прочтения файла удалял его?
Если возможно реализовать удаления файлов после прочтения, считать строки уже тогда будет не актуально.

Спасибо за помощь!

Программка которой я режу txt на количество строк "KeyWordKeeper"
Изначально я задумывал 2 цикла:

1.
Почистил лог.
Code: (clickermann) [Select]
FOR ($a=0, $a<1)    // 1 кусок цикла
 
      WAITMS(10)
      LCLICK(1011,360)
 
   END_CYC
- это для того что бы клацать на кнопку очистки лога, что бы он не рос...

2. Это сам процесс со строками, из текстового файла скопировать строку в буфер и вставить куда нужно.

Отрабатывает $i < 150 выходит с цикла, - жмет кнопку, чистит лог ) только для этого. И так по идеи должно было быть по кругу.


Только что запустил для теста скрипт что Вы написали:
Создал 2 txt файла закинул в один 2000 строк в другой 750.
Скрипт прочитал по 150 строк из каждого файла и удалил их )

я бы мог изменить значение $i < 150 например на 50000 но тогда, лог будет расти и начнет тормозить ( особенно под конец.

Идея простая (наверное :D), нажать ЛКМ (почистить лог), вставить по очереди 150 строк из файла на 100к строк, нажать ЛКМ. И так по кругу до конца строк в файле и так к следующему.

не знаю на сколько это правильно но команду
Code: (clickermann) [Select]
HALT
я всегда убираю
Code: (clickermann) [Select]
//HALT

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Переделал.)
Очистку лога перенес во внутренний цикл.
Вынес в начало скрипта настройки: удаления файлов (переменная $del) и очистки Лога (переменная $clear).

Code: (clickermann) [Select]
// Этот скрипт положить в папку с обрабатываемыми им файлами

// Удаление обработанных файлов:
$del = 0 // 1 - удалять; 0 - не удалять

// Очистка Лога:
$clear = 150 // количество обработанных строк до очистки Лога

//--------------------------------

LOGCLEAR

GETFILELIST($arr, "*.txt") // список всех *.txt файлов в папке

FOR($n = 0, $n < ARRSIZE($arr))
   
   $file = $arr[$n]
   
   $count = TFCOUNT($file) + 1 // количество строк в файле
   
   FOR ($i = 1, $i < $count) // 2 кусок
     
      $b = TFREAD($file, $i)
     
      TOCLIP(STRCONCAT("Привет ", $b))
     
      KEYDOWN(#CTRL)
      KEYPRESS(#V)
      KEYUP(#CTRL)
     
      KEYPRESS(#ENTER)
      WAITMS(5)
     
      INC($num) // количество обработанных строк в файлах
     
      INC($e,1)  // нарастающая переменная, считает количество строк в Логе
     
      IF($e = $clear) // если обработано 150 строк - очищаем Лог
         WAITMS(10)
         LCLICK(1011,360)
         $e = 0 // обнуляем счетчик строк Лога
         LCLICK(344,705)
      END_IF
     
   END_CYC
   
   // INC($num,$i) // количество обработанных строк в файлах, по окончании обработки фала
   
   IF($del)
      TFCLEAR($file, 1) // удаление обработанного файла с диска (мимо корзины)
   END_IF
   
END_CYC

SETTHREAD (log, 0) // когда все файлы обработаны - остановить поток "log"
LOGWRITE ("Всего бработано строк: ", $num) // вывод в лог последней статистики

THREAD(name, 1)
   WAIT(1) // частота вывода в лог
   LOGCLEAR // чтобы лог не разрастался
   LOGWRITE ("В обработке файл: ", $file) // вывод в лог
   LOGWRITE ("Обработано строк: ", $num)
END_THREAD

HALT

stadon

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Переделал.)
Очистку лога перенес во внутренний цикл.
Вынес в начало скрипта настройки: удаления файлов (переменная $del) и очистки Лога (переменная $clear).

Code: (clickermann) [Select]
// Этот скрипт положить в папку с обрабатываемыми им файлами

// Удаление обработанных файлов:
$del = 0 // 1 - удалять; 0 - не удалять

// Очистка Лога:
$clear = 150 // количество обработанных строк до очистки Лога

//--------------------------------

LOGCLEAR

GETFILELIST($arr, "*.txt") // список всех *.txt файлов в папке

FOR($n = 0, $n < ARRSIZE($arr))
   
   $file = $arr[$n]
   
   $count = TFCOUNT($file) + 1 // количество строк в файле
   
   FOR ($i = 1, $i < $count) // 2 кусок
     
      $b = TFREAD($file, $i)
     
      TOCLIP(STRCONCAT("Привет ", $b))
     
      KEYDOWN(#CTRL)
      KEYPRESS(#V)
      KEYUP(#CTRL)
     
      KEYPRESS(#ENTER)
      WAITMS(5)
     
      INC($num) // количество обработанных строк в файлах
     
      INC($e,1)  // нарастающая переменная, считает количество строк в Логе
     
      IF($e = $clear) // если обработано 150 строк - очищаем Лог
         WAITMS(10)
         LCLICK(1011,360)
         $e = 0 // обнуляем счетчик строк Лога
         LCLICK(344,705)
      END_IF
     
   END_CYC
   
   // INC($num,$i) // количество обработанных строк в файлах, по окончании обработки фала
   
   IF($del)
      TFCLEAR($file, 1) // удаление обработанного файла с диска (мимо корзины)
   END_IF
   
END_CYC

SETTHREAD (log, 0) // когда все файлы обработаны - остановить поток "log"
LOGWRITE ("Всего бработано строк: ", $num) // вывод в лог последней статистики

THREAD(name, 1)
   WAIT(1) // частота вывода в лог
   LOGCLEAR // чтобы лог не разрастался
   LOGWRITE ("В обработке файл: ", $file) // вывод в лог
   LOGWRITE ("Обработано строк: ", $num)
END_THREAD

HALT


Спасибо Вам большое! :)
Тестил пол дня, в разных вариациях )) все отлично работает, как часы, тумблер только переключил на 1 в "$del = 0 // 1 - удалять; 0 - не удалять", потому что при 0 считывает больше строк (3000+) чем есть в файлах (2750)...
Еще раз спасибо, так в Вашей помощью тут можно машину по картинкам собрать  8)