Страница 1 из 1

Вывод нескольких строчек из файла

СообщениеДобавлено: 10 фев 2014 14:16
valera
Привет народ. Помогите со скриптом.
Есть файл .txt, размером 10мб
Нужно, чтобы по команде бот брал заданное кол-во строчек из файла, идущих подряд и писал их в канал по команде

Re: Вывод нескольких строчек из файла

СообщениеДобавлено: 10 фев 2014 15:24
tvrsh
Читал вот это? post47.html#p47
Из какого места файла брать строчки?

Re: Вывод нескольких строчек из файла

СообщениеДобавлено: 10 фев 2014 15:39
valera
tvrsh писал(а):Читал вот это? post47.html#p47
Из какого места файла брать строчки?


читал, в кодинге совсем не силен)
строчки брать из рандомного места, но не по одной, а по заданному числу

не могу понять, как сделать, чтобы брать не одну строчку, а например 5

TCL: [ Скачать ] [ Скрыть ]
#settings#
set txtfolder "/home/eggdrop/bot/scripts"

#binds#
bind pub - !txt LQ:txt

#script#

proc LQ:txt {nick mask handle chan text} {
global txtfolder
set random_q [ LQ:load $txtfolder/old.txt ]
putmsg $chan "[lindex $random_q [rand [llength  $random_q]]]"
}

proc LQ:load {file} {
putlog "load $file"
set fd [open $file r]
while {![eof $fd]} {
 gets $fd dline
 lappend var $dline
 }
close $fd
return $var
}

Re: Вывод нескольких строчек из файла

СообщениеДобавлено: 10 фев 2014 16:23
tvrsh
Попробуй этот код:
TCL: [ Скачать ] [ Скрыть ]
# Биндим команду
bind pub - !txt txtproc

# Начинается процедура
proc txtproc {nick uhost hand chan text} {

# Открываем условие. Если после команды число от 0 до 10, то выполнятся действия в первых скобках.
if {[isnumber $text] && $text > 0 && $text <= 10} {
# Имя файла который будем читать.
set fname "yourfile.txt"

# Открываем доступ к файлу для чтения (мы не ловим ошибки, однако
# можно использовать catch {} в случае если файл отсутствует.
set fp [open $fname "r"]

# Тут мы считываем все данные из файла.
set data [read -nonewline $fp]

# Закрываем файл.
close $fp

# Теперь разбиваем данные на отдельные строки.
set lines [split $data "\n"]

# получаем количество строк в файле.
set numlines [llength $lines]

# Выбираем номер случайной строки используя функцию rand.
set num [rand $numlines]

# Устанавливаем счетчик
set i 0
# Условие: пока счетчик меньше или равен числу в команде, то ...
while {$i <= $text} {
    # Выводим в канал строку начиная со случайной...
    putserv "PRIVMSG $chan :[lindex $lines [expr $num + $i]]"    
    #  и каждый раз увеличивая ее номер на счетчик
    incr i
}
} else {
# А эти действия для случая когда условия выше не выполняются.
    putserv "PRIVMSG $chan :$nick, в команде укажите число строк от 0 до 10"
    return 0
}
}

Re: Вывод нескольких строчек из файла

СообщениеДобавлено: 10 фев 2014 16:32
valera
tvrsh, спасибо большое. то что нужно, все работает

Re: Вывод нескольких строчек из файла

СообщениеДобавлено: 13 окт 2014 20:48
Bart
tvrsh писал(а):Попробуй этот код:
TCL: [ Скачать ] [ Скрыть ]
# Биндим команду
bind pub - !txt txtproc

# Начинается процедура
proc txtproc {nick uhost hand chan text} {

# Открываем условие. Если после команды число от 0 до 10, то выполнятся действия в первых скобках.
if {[isnumber $text] && $text > 0 && $text <= 10} {
# Имя файла который будем читать.
set fname "yourfile.txt"

# Открываем доступ к файлу для чтения (мы не ловим ошибки, однако
# можно использовать catch {} в случае если файл отсутствует.
set fp [open $fname "r"]

# Тут мы считываем все данные из файла.
set data [read -nonewline $fp]

# Закрываем файл.
close $fp

# Теперь разбиваем данные на отдельные строки.
set lines [split $data "\n"]

# получаем количество строк в файле.
set numlines [llength $lines]

# Выбираем номер случайной строки используя функцию rand.
set num [rand $numlines]

# Устанавливаем счетчик
set i 0
# Условие: пока счетчик меньше или равен числу в команде, то ...
while {$i <= $text} {
    # Выводим в канал строку начиная со случайной...
    putserv "PRIVMSG $chan :[lindex $lines [expr $num + $i]]"    
    #  и каждый раз увеличивая ее номер на счетчик
    incr i
}
} else {
# А эти действия для случая когда условия выше не выполняются.
    putserv "PRIVMSG $chan :$nick, в команде укажите число строк от 0 до 10"
    return 0
}
}


А если данные в файле в таком формате:
текст1
текст2
текст3
Как вывести эти строчки в канал в таком формате?
текст1 текст2 текст3
То есть, в строчку.
И что самое важное, чтобы не ограничивалось одним сообщением, если строк будет больше 100, например.

Re: Вывод нескольких строчек из файла

СообщениеДобавлено: 13 окт 2014 21:03
Vertigo
Как вывести эти строчки в канал в таком формате?
текст1 текст2 текст3
То есть, в строчку.


Заменить часть кода
TCL: [ Скачать ] [ Скрыть ]
# Устанавливаем счетчик
set i 0
# Условие: пока счетчик меньше или равен числу в команде, то ...
while {$i <= $text} {
     # Выводим в канал строку начиная со случайной...
     putserv "PRIVMSG $chan :[lindex $lines [expr $num + $i]]"    
     #  и каждый раз увеличивая ее номер на счетчик
     incr i
}
на
TCL: [ Скачать ] [ Скрыть ]
# Устанавливаем счетчик
set i 0
# Устанавливаем переменную со списком
set list [list]
# Условие: пока счетчик меньше или равен числу в команде, то ...
while {$i <= $text} {
     # Добавляем в список строку начиная со случайной...
     lappend list [lindex $lines [expr $num + $i]]    
     #  и каждый раз увеличивая ее номер на счетчик
     incr i
}
# Выводим полученный список в канал
putserv "PRIVMSG $chan :[join $list]"

Re: Вывод нескольких строчек из файла

СообщениеДобавлено: 13 окт 2014 22:00
Bart
Работает, спасибо.

[21:58] <~warlock> !test 5
[21:58] <bot> тест1 тест2 тест3 тест4 тест5 тест6
Ок.
[21:58] <~warlock> !test 50
[21:59] <bot> тест1 тест2 тест3 тест4 тест5 тест6 тест7 тест8 тест9 тест10 тест11 тест12 тест13 тест14 тест15 тест16 тест17 тест18 тест19 тест20 тест21 тест22 тест23 тест24 тест25 тест26 тест27 тест28 тест29 тест30 тест31 тест32 тест33 тест34 тест35 тест36 тест37 тест38 тест39 тест40 тест41 тест42 т
Вот остальные слова можно перевести на новое сообщение?

Re: Вывод нескольких строчек из файла

СообщениеДобавлено: 13 окт 2014 22:29
Vertigo
Вот остальные слова можно перевести на новое сообщение?

Посмотри процедуру вывода с разбиением по строкам в скриптах tvrsh. В том же, eweather2, например. Процедура называется
# Работа с длинными строками
proc ::eweather::print {text chan} {

Копируешь её себе и отправляешь текст на канал через ::твой_неймспейс::print [join $list] $chan. Если с неймспейсами пока туго, копируй процедуру просто как print (в тикле нет стандартной такой команды). И вызывать тогда просто через print [join $list] $chan. Успехов.

Re: Вывод нескольких строчек из файла

СообщениеДобавлено: 13 окт 2014 22:48
Bart
Получилось. :)