Что нового

[Данные, строки] Выборка ссылок из списка и запись в файл

Math

Новичок
Сообщения
85
Репутация
1
Есть 2 файла:
1. ini, который имеет вид:
[NumberFile]
Количество файлов
NumberFile=100

[File1]
FileName=abc123.iso
LinkFile=

[File2]
FileName=xy123456.avi
LinkFile=

затем File3 и т.д.
2. Текстовый документ со списком ссылок:
http://site.com/kjtrzwe5yxxa xy123456.avi
http://site.com/hc0xuirpafz3 abc123.iso
и т.д.

Нужен скрипт, который найдёт в списке ссылок каждый файл, и запишет ссылку на него в соответствующую этому файлу секцию в ini-файле.

Т.е. результат:
[NumberFile]
Количество файлов
NumberFile=100

[File1]
FileName=abc123.iso
LinkFile=http://site.com/hc0xuirpafz3

[File2]
FileName=xy123456.avi
LinkFile=http://site.com/kjtrzwe5yxxa

затем File3 и т.д.

Как такое реализовать?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Примерно так:
Код:
#include <File.au3>

$sFile=@ScriptDir & "\Test.txt"
$sIniFile=@ScriptDir & "\Test.ini"

Dim $aRecords
If Not _FileReadToArray($sFile,$aRecords) Then
   MsgBox(4096,"Error", " Error reading log to Array     error:" & @error)
	Exit
EndIf

For $i = 1 to $aRecords[0]
    ;$sPatern = "(\S+)\s*"
    $sPatern = "^(\S+)\s*(.+)$" ; Так корректней будет	
    $aData = StringRegExp( $aRecords[$i], $sPatern, 3 )
    IniWrite($sIniFile, "File" & $i, "FileName",  $aData[1])
    IniWrite($sIniFile, "File" & $i, "LinkFile",  $aData[0])
Next
 
Автор
M

Math

Новичок
Сообщения
85
Репутация
1
Это мне и было нужно. Спасибо.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Или :
Код:
For $i = 1 to $aRecords[0]
  ; $sPatern = "(\S+)\s*"
   $sPatern = "^(\S+)\s*(.+)$" ; Так  корректней будет
   $aData = StringRegExp( $aRecords[$i], $sPatern, 3 )
   IniWriteSection($sIniFile, "File" & $i, "FileName=" & $aData[1] & @LF & "LinkFile=" &  $aData[0])
Next


Надо исправить :
Код:
;$sPatern = "(\S+)\s*(.+)"
$sPatern = "^(\S+)\s*(.+)$" ; Так еще корректней будет


Т.к. в названии фильма могут быть и пробелы
 
Автор
M

Math

Новичок
Сообщения
85
Репутация
1
Сейчас использовал этот скрипт и возникла серьёзная проблема.

Если в секциях исходного ини-файла используются дополнительные строки, например:

[NumberFile]
Количество файлов
NumberFile=100

[File1]
FileName=abc123.iso
LinkFile=
Size= 30 Mb.
Screen=1.jpg

[File2]
FileName=xy123456.avi
LinkFile=
Size= 40 Mb.
Screen=2.jpg

затем File3 и т.д.

То при использовании первого варианта скрипта все дополнительные данные перемешиваются (т.е. уже не относятся к тому файлу, к которому относились изначально) , а второго - попросту стираются.

Как решить проблему?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Math [?]
То при использовании первого варианта скрипта все дополнительные данные перемешиваются (т.е. уже не относятся к тому файлу, к которому относились изначально) , а второго - попросту стираются.

Ты не можешь этим скриптом дополнительно заносить данные в ИНИ-файл.
При повторном занесении надо
1. определять номер последней секции (записи [FileN])
2. Изменить цикл :
Код:
For $i = 1 to $aRecords[0]
на :
Код:
For $i = N+1 to N+$aRecords[0]
 
Автор
M

Math

Новичок
Сообщения
85
Репутация
1
Т.е. при этом в файл будут вноситься и все дополнительные данные? Как тогда определить номер последней секции?

Или в моём случае нужно другое решение?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Math [?]
Как тогда определить номер последней секции

Получи массив секций :
Где-то так :
Код:
$aSect=IniReadSectionNames ( $sIniFile)
$iN=UBound($aSect)-1

For $i = 1 to $aRecords[0]
	$sPatern = "^(\S+)\s*(.+)$"
   $aData = StringRegExp( $aRecords[$i], $sPatern, 3 )
   IniWriteSection($sIniFile, "File" & $i+$iN, "FileName=" & $aData[1] & @LF & "LinkFile=" &  $aData[0])
Next
 
Автор
M

Math

Новичок
Сообщения
85
Репутация
1

В этом случае скрипт добавляет секции в конец файла.
Т.е. было так (всего обрабатывалось 65 файлов):
[NumberFile]
Количество файлов
NumberFile=65

[File1]
FileName=abc123.iso
LinkFile=
Size= 30 Mb.
Screen=1.jpg

[File2]
FileName=xy123456.avi
LinkFile=
Size= 40 Mb.
Screen=2.jpg

затем от File3 до File65

Стало так:
[NumberFile]
Количество файлов
NumberFile=65

[File1]
FileName=abc123.iso
LinkFile=
Size= 30 Mb.
Screen=1.jpg

[File2]
FileName=xy123456.avi
LinkFile=
Size= 40 Mb.
Screen=2.jpg

затем от File3 до File65

[File69]
FileName=abc123.iso
LinkFile=http://site.com/hc0xuirpafz3
[File70]
FileName=xy123456.avi
LinkFile=http://site.com/kjtrzwe5yxxa

затем от File71 до File133

Как сделать запись в те же секции со всеми дополнительными параметрами?
 
Автор
M

Math

Новичок
Сообщения
85
Репутация
1
Почему у меня везде пишет Not Found, кроме одного?

Код:
Func LinkMakeSpisokToMessage()
$MessageEdit=@ScriptDir & "\MessageEdit.ini"
$ListLinks=@ScriptDir & "\links.txt"
$TempIni=@ScriptDir & "\temp.ini"
$NumberVideo = IniRead($MessageEdit, "NumberVideo", "NumberVideo", "0")

for $i=1 to $NumberVideo
$Line = FileReadLine ($ListLinks,$i)
IniWrite ($TempIni,"links", "link"&string($i), $Line)
Next

Sleep(5000)

for $i=1 to $NumberVideo
	$NameVideo = IniRead ($MessageEdit, "message"&string($i), "video", "")

	for $i=1 to $NumberVideo
	$LinkSM = IniRead($TempIni, "links", "link"&string($i), "0")
	$StringMatching = StringRegExp($LinkSM, $NameVideo, 0)
	
	If $StringMatching = 1 Then		
		$LinkRep = StringReplace ($LinkSM, $NameVideo, "") 
		$LinkRep1 =  StringReplace ($LinkRep, " ", "")
		IniWrite ($MessageEdit, "message"&string($i), "PrimaryLink1", $LinkRep1)
		ExitLoop
	Else
		IniWrite ($MessageEdit, "message"&string($i), "PrimaryLink1", "Not Found!")
	EndIf
    Next
Next
MsgBox(0,"1", "Готово!")
EndFunc

При этом ссылка, принадлежащая файлу из первой секции - записывается в последнию секцию. Остальные Not Found.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Math [?]
Как сделать запись в те же секции со всеми дополнительными параметрами?

[?]
Почему у меня везде пишет Not Found, кроме одного?

Конструкция приведенного скрипта оставляет желать лучшего.

IniWrite ($MessageEdit, "message"&string($i), "PrimaryLink1", $LinkRep1); Что это такое?

Зачем два одинаковых цикла (причем один внутри другого) ?

Код:
for $i=1 to $NumberVideo
    $NameVideo = IniRead ($MessageEdit, "message"&string($i), "video", "")
 for $i=1 to $NumberVideo
;...............

Надо делать примерно так :
Код:
$sIniFile=@ScriptDir & "\MessageEdit.ini"

$ListLinks=@ScriptDir & "\links.txt"
$ListLinks1=@ScriptDir & "\links1.txt"

LinkMakeSpisokToMessage($ListLinks); Чтение из 1-го файла
LinkMakeSpisokToMessage($ListLinks1);Чтение из 2-го файла
;.............................................................. ; Чтение из ...-го файла

Func LinkMakeSpisokToMessage($sFile)
	Local $i=0, $iNumber=1
	While 1
		$i+=1
		$Line = FileReadLine ($sFile,$i)
		If @error = -1 Then ExitLoop
		MsgBox(0,'$Line', $Line, 1)
		$sPatern = "^(\S+)\s*(.+)$" 
		$aData = StringRegExp( $Line, $sPatern, 3 )
		If @error  Then ExitLoop
		$sFileLink=$aData[0]
		$sFileName=$aData[1]
		$aSection=IniReadSectionNames($sIniFile)
		For $j=1 To UBound($aSection)-1
			$iReadFileName=IniRead($sIniFile, $aSection[$j], "FileName", '')
			$iReadLinc=IniRead($sIniFile, $aSection[$j], "LinkFile", '')
			If $sFileName=$iReadFileName Then;
				MsgBox(0,$iReadFileName,'Информация о фильме присутствует', 1)
				$iNumber=$j; Запись в существующую секцию : "File" & $j
				If $iReadLinc <> '' Then 
					If $iReadLinc=$sFileLink Then ContinueLoop 2; Переход к следуюей строке из внешнего цикла (While-Wend)
					If MsgBox(4,$iReadLinc,'Ссылка на фильм присутствует. ' & @CRLF & $iReadLinc & @CRLF & 'Заменить на : ?' & @CRLF &  $sFileLink) <> 6  Then ContinueLoop 2;Переход к следуюей строке из внешнего цикла (While-Wend)
					ExitLoop; Завершить внутренний цикл(For-Next)
				EndIf
			Else
				$iNumber=UBound($aSection); Запись в новую секцию
			EndIf
		Next
		IniWrite($sIniFile, "File" & $iNumber, "FileName",  $aData[1])
		IniWrite($sIniFile, "File" & $iNumber, "LinkFile",  $aData[0])
	WEnd
EndFunc
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
А вообще-то я бы изменил формат ИНИ-файла :
Код:
[File1]
FileName=abc123.iso
LinkFile=
Size= 30 Mb.
Screen=1.jpg

на :

Код:
[FilmName]
LinkFile=
Size= 30 Mb.
Screen=1.jpg

что заметно упростит обработку.
 
Автор
M

Math

Новичок
Сообщения
85
Репутация
1
gregaz сказал(а):
IniWrite ($MessageEdit, "message"&string($i), "PrimaryLink1", $LinkRep1); Что это такое?
Тоже самое, что и IniWrite ($MessageEdit, "message"&$i, "PrimaryLink1", $LinkRep1);

gregaz сказал(а):
Зачем два одинаковых цикла (причем один внутри другого) ?
В первом цикле задаётся номер секции, которая обрабатывается. Номер равен $i.
Второй цикл ищет совпадение и записывает данные в секцию.

gregaz сказал(а):
Надо делать примерно так :
Попробую разобраться.

gregaz сказал(а):
А вообще-то я бы изменил формат ИНИ-файла :
Предложенный вами новый формат файла не подходит, так как получившийся ини-файл затем используется другим скриптом. И эта нумерация очень важна.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Math [?]
В первом цикле задаётся номер секции, которая обрабатывается. Номер равен $i.
Второй цикл ищет совпадение и записывает данные в секцию.

По любому второй цикл не может быть тоже по $i
Надо сделать хотя бы по $j
 
Верх