Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Присвоить значения переменной из текстового файла (http://forum.oszone.net/showthread.php?t=278293)

Cem 24-02-2014 18:08 2314923

Присвоить значения переменной из текстового файла
 
Доброго времени суток! Помогите, пожалуйста, с командами и синтаксисом.
Задача:
Имеется текстовый документ 1.txt:
Код:

1.Собака
2.D:\Image\Собака.jpeg
3.D:\Video\Собака.mpeg
4.
5.Кот
6.D:\Image\Кот.jpeg
7.D:\Video\Кот.mpeg
8.
9.Черепаха
10.D:\Image\Черепаха.jpeg
11.D:\Video\Черепаха.mpeg

Номера строк приведены для указания того, что между строками бывают и пустые. В самом текстовом документе нумерации строк нет.
Код:

Собака
D:\Image\Собака.jpeg
D:\Video\Собака.mpeg

Кот
D:\Image\Кот.jpeg
D:\Video\Кот.mpeg

Черепаха
D:\Image\Черепаха.jpeg
D:\Video\Черепаха.mpeg

Через InputBox мы вводим название животного. Находим его в тексте:
Код:

$VesText = FileRead("1.txt")
$Jivotnoe = InputBox("Название", "Введите животное:", "Здесь вводим", "", 250, 150, Default, Default, 0)
$a = StringRegExp($VesText, $Jivotnoe, 1)
MsgBox(0, '', $a[0])

Теперь вопрос: После того как мы нашли животное, например, Кот (5 строка в документе), как присвоить переменной $kartinka значение "D:\Image\Кот.jpeg" (6 строка), а переменной $video - "D:\Video\Кот.mpeg" (7 строка)?

Iska 24-02-2014 23:38 2315080

Цитата:

Цитата Cem
Номера строк приведены для указания того, что между строками бывают и пустые. В самом текстовом документе нумерации строк нет. »

Это лишнее. Достаточно оформить текст тэгом [code] (что Вы и так сделали), либо, если важно сохранить кодировку, вид концов строк и т.п. — упаковав файл в архив.

Цитата:

Цитата Cem
Теперь вопрос: После того как мы нашли животное, например, Кот (5 строка в документе), как присвоить переменной $kartinka значение "D:\Image\Кот.jpeg" (6 строка), а переменной $video - "D:\Video\Кот.mpeg" (7 строка)? »

Например, так:
Код:

#include <Array.au3>

AutoItSetOption("MustDeclareVars", 1)

Local $aContent = StringSplit(FileRead("1.txt"), @CRLF, 3)
Local $sName    = InputBox("Название", "Введите животное:", "Здесь вводим", "", 250, 150, Default, Default, 0)

Local $lIndex = _ArraySearch($aContent, $sName)

if $lIndex >=0 Then
        MsgBox(1, "", $aContent[$lIndex + 1])
        MsgBox(1, "", $aContent[$lIndex + 2])
EndIf

Крайне рекомендую перевести Ваш текстовый файл в формат ini-файла и пользовать соответствующие функции.

Cem 25-02-2014 02:03 2315156

Спасибо! Как оказалось, всё гениальное действительно просто.

Цитата:

Цитата Iska
Local $aContent = StringSplit(FileRead("1.txt"), @CRLF, 3) »

Только тут, пожалуй, лучше поставить 1.
Код:

Local $aContent = StringSplit(FileRead("1.txt"), @CRLF, 1)
Сложил было, что-то такое, но коряво работает.
Код:

$VesText = FileRead("1.txt")
$Jivotnoe = InputBox("Название", "Введите животное:", "Здесь вводим", "", 250, 150, Default, Default, 0)
$a = StringRegExp($VesText, $Jivotnoe, 2, 1)

$aLines = StringSplit($VesText, @CRLF, 1) ;Разбиваем текст на строки, строки помещаем в массив

For $i = 1 To $aLines[0] Step +1
    If StringInStr($aLines[$i], $Jivotnoe) Then $kartinka = $aLines[$i+1]
Next


Iska 25-02-2014 09:20 2315226

Cem, по-прежнему настоятельно рекомендую подумать над переводом Вашего файла в формат INI, наподобие:
Код:

[Собака]
"Image"="D:\Image\Собака.jpeg"
"Video"="D:\Video\Собака.mpeg"

[Кот]
"Image"="D:\Image\Кот.jpeg"
"Video"="D:\Video\Кот.mpeg"

[Черепаха]
"Image"="D:\Image\Черепаха.jpeg"
"Video"="D:\Video\Черепаха.mpeg"


madmasles 25-02-2014 10:51 2315265

Cem,
Можно так попробовать сделать:
Код:

Local $sTxt, $aSearch[3] = ['Собака', 'Кот', 'Черепаха'], $sImageFile, $sVideoFile

$sTxt = FileRead(@ScriptDir & '\tst.txt')

For $i = 0 To 2
    If Not StringInStr($sTxt, $aSearch[$i], 1) Then
        If Not StringInStr($sTxt, StringLower($aSearch[$i]), 1) Then
            ConsoleWrite('No word "' & $aSearch[$i] & '" in text' & @LF)
            ContinueLoop
        EndIf
    EndIf
    $sImageFile = StringRegExpReplace($sTxt, '(?ims).*^([a-z].*?\\' & $aSearch[$i] & '\.j.*?)$.*', '$1')
    If @extended <> 1 Then
        $sImageFile = StringRegExpReplace($sTxt, '(?ims).*^([a-z].*?\\' & StringLower($aSearch[$i]) & '\.j.*?)$.*', '$1')
        If @extended <> 1 Then
            ConsoleWrite('Can not search image file for word "' & $aSearch[$i] & '" in text' & @LF)
            ContinueLoop
        EndIf
    EndIf
    $sVideoFile = StringRegExpReplace($sTxt, '(?ims).*^([a-z].*?\\' & $aSearch[$i] & '\.m.*?)$.*', '$1')
    If @extended <> 1 Then
        $sVideoFile = StringRegExpReplace($sTxt, '(?ims).*^([a-z].*?\\' & StringLower($aSearch[$i]) & '\.m.*?)$.*', '$1')
        If @extended <> 1 Then
            ConsoleWrite('Can not search video file for word "' & $aSearch[$i] & '" in text' & @LF)
            ContinueLoop
        EndIf
    EndIf
    ConsoleWrite('image file for word "' & $aSearch[$i] & '": ' & $sImageFile & @LF)
    ConsoleWrite('video file for word "' & $aSearch[$i] & '": ' & $sVideoFile & @LF)
    ConsoleWrite('---' & @LF)
Next

tst.txt:
Код:

Собака
D:\Image\Собака.jpeg
D:\Video\собака.mpeg

Кот
D:\Image\кот.jpeg
D:\Video\Кот.mpeg

черепаха
D:\Image\черепаха.jpeg
D:\Video\черепаха.mpeg


madmasles 25-02-2014 11:07 2315275

Cem,
Но рекомендую Вам сделать так, как советует коллега Iska, тогда код будет примерно такой:
Код:

Local $sIni = @ScriptDir & '\tst.ini', $aSearch[3] = ['Собака', 'Кот', 'Черепаха'], $sImageFile, $sVideoFile

For $i = 0 To 2
    $sImageFile = IniRead($sIni, $aSearch[$i], 'Image', 'Error')
    If $sImageFile = 'Error' Then
        $sImageFile = IniRead($sIni, StringLower($aSearch[$i]), 'Image', 'Error')
        If $sImageFile = 'Error' Then
            ConsoleWrite('Can not search image file for word "' & $aSearch[$i] & '" in text' & @LF)
            ContinueLoop
        EndIf
    EndIf
    $sVideoFile = IniRead($sIni, $aSearch[$i], 'Video', 'Error')
    If $sVideoFile = 'Error' Then
        $sVideoFile = IniRead($sIni, StringLower($aSearch[$i]), 'Video', 'Error')
        If $sVideoFile = 'Error' Then
            ConsoleWrite('Can not search video file for word "' & $aSearch[$i] & '" in text' & @LF)
            ContinueLoop
        EndIf
    EndIf
    ConsoleWrite('image file for word "' & $aSearch[$i] & '": ' & $sImageFile & @LF)
    ConsoleWrite('video file for word "' & $aSearch[$i] & '": ' & $sVideoFile & @LF)
    ConsoleWrite('---' & @LF)
Next

tst.ini:
Код:

[Собака]
Image="D:\Image\Собака.jpeg"
Video="D:\Video\Собака.mpeg"
[кот]
Image="D:\Image\Кот.jpeg"
Video="D:\Video\Кот.mpeg"
[Черепаха]
Image="D:\Image\Черепаха.jpeg"
Video="D:\Video\Черепаха.mpeg"


Cem 27-02-2014 15:37 2316768

madmasles, Спасибо! Ваш метод, конечно, очень хорош, однако, в таком случае, если на данный момент "Животных" - 1200 наименований, то

Цитата:

Цитата madmasles
Local $sTxt, $aSearch[3] = ['Собака', 'Кот', 'Черепаха'], $sImageFile, $sVideoFile »

будет выглядеть немного "страшно", а база может пополняться (загрузчик для базы уже написал).
Касательно метода, товарища Iska (которому отдельное СПАСИБО) - наверное, идеальное решение.
Надо разобраться, пойду дальше листать литературу.

madmasles 01-03-2014 12:32 2317652

Cem,
Печально, но Вы не поняли, что $aSearch[3] используется только для примера поиска.
читать дальше »
Код:

Local $sTxt, $sSearch, $sImageFile, $sVideoFile

$sSearch = InputBox('Название', 'Введите животное:', 'Здесь вводим', '', 250, 150, Default, Default, 0)
If Not $sSearch Then Exit 1
$sTxt = FileRead(@ScriptDir & '\tst.txt')
If Not StringInStr($sTxt, $sSearch, 1) Then
    If Not StringInStr($sTxt, StringLower($sSearch), 1) Then
        ConsoleWrite('No word "' & $sSearch & '" in text' & @LF)
        Exit 2
    EndIf
EndIf
$sImageFile = StringRegExpReplace($sTxt, '(?ims).*^([a-z].*?\\' & $sSearch & '\.j.*?)$.*', '$1')
If @extended <> 1 Then
    $sImageFile = StringRegExpReplace($sTxt, '(?ims).*^([a-z].*?\\' & StringLower($sSearch) & '\.j.*?)$.*', '$1')
    If @extended <> 1 Then
        ConsoleWrite('Can not search image file for word "' & $sSearch & '" in text' & @LF)
    EndIf
EndIf
$sVideoFile = StringRegExpReplace($sTxt, '(?ims).*^([a-z].*?\\' & $sSearch & '\.m.*?)$.*', '$1')
If @extended <> 1 Then
    $sVideoFile = StringRegExpReplace($sTxt, '(?ims).*^([a-z].*?\\' & StringLower($sSearch) & '\.m.*?)$.*', '$1')
    If @extended <> 1 Then
        ConsoleWrite('Can not search video file for word "' & $sSearch & '" in text' & @LF)
    EndIf
EndIf
ConsoleWrite('Image file for word "' & $sSearch & '": ' & $sImageFile & @LF)
ConsoleWrite('Video file for word "' & $sSearch & '": ' & $sVideoFile & @LF)

и
читать дальше »
Код:

Local $sIni = @ScriptDir & '\tst.ini', $sSearch, $sImageFile, $sVideoFile

$sSearch = InputBox('Название', 'Введите животное:', 'Здесь вводим', '', 250, 150, Default, Default, 0)
If Not $sSearch Then Exit 1
$sImageFile = IniRead($sIni, $sSearch, 'Image', 'Error')
If $sImageFile = 'Error' Then
    $sImageFile = IniRead($sIni, StringLower($sSearch), 'Image', 'Error')
    If $sImageFile = 'Error' Then
        ConsoleWrite('Can not search image file for word "' & $sSearch & '" in text' & @LF)
    EndIf
EndIf
$sVideoFile = IniRead($sIni, $sSearch, 'Video', 'Error')
If $sVideoFile = 'Error' Then
    $sVideoFile = IniRead($sIni, StringLower($sSearch), 'Video', 'Error')
    If $sVideoFile = 'Error' Then
        ConsoleWrite('Can not search video file for word "' & $sSearch & '" in text' & @LF)
    EndIf
EndIf
If $sImageFile <> 'Error' Then ConsoleWrite('Image file for word "' & $sSearch & '": ' & $sImageFile & @LF)
If $sVideoFile <> 'Error' Then ConsoleWrite('Video file for word "' & $sSearch & '": ' & $sVideoFile & @LF)


Cem 04-03-2014 05:02 2318825

madmasles, Спасибо! Очень подробно "разжевали", теперь понял.

madmasles 05-03-2014 19:11 2319619

Cem,
Если у Вас всегда путь к файлам $sImageFile и $sVideoFile отличается только названием животного, то можно сделать совсем просто, без всяких файлов-баз:
Код:

Local $s_Animal, $s_ImageFile, $s_VideoFile, $a_Path[2][2] = [[@ScriptDir & '\Files\Image\', '.jpeg'],[@ScriptDir & '\Files\Video\', '.mpeg']]

;~ $a_Path[0][0]    - полный путь с обратным слешем в конце к папке с файлами-картинками;
;~ $a_Path[1][1]    - расширение файлов-картинок;
;~ $a_Path[1][0]    - полный путь с обратным слешем в конце к папке с файлами-видео;
;~ $a_Path[1][1]    - расширение файлов-видео.

;~ поменяйте эти пути и расширения на свои.

$s_Animal = InputBox('Название', 'Введите животное:', 'Здесь вводим', '', 250, 150, Default, Default, 0)
If Not $s_Animal Then Exit 1
If FileExists($a_Path[0][0] & $s_Animal & $a_Path[0][1]) Then
    $s_ImageFile = $a_Path[0][0] & $s_Animal & $a_Path[0][1]
EndIf
If FileExists($a_Path[1][0] & $s_Animal & $a_Path[1][1]) Then
    $s_VideoFile = $a_Path[1][0] & $s_Animal & $a_Path[1][1]
EndIf
If $s_ImageFile Then
    ConsoleWrite('Image file for animal "' & $s_Animal & '": ' & $s_ImageFile & @LF)
Else
    ConsoleWrite('Can not search image file for animal "' & $s_Animal & '"' & @LF)
EndIf
If $s_VideoFile Then
    ConsoleWrite('Video file for animal "' & $s_Animal & '": ' & $s_VideoFile & @LF)
Else
    ConsoleWrite('Can not search video file for animal "' & $s_Animal & '"' & @LF)
EndIf



Время: 22:35.

Время: 22:35.
© OSzone.net 2001-