Что нового

Часть ip заменить в файле

mikzin

Новичок
Сообщения
80
Репутация
0
доброго дня, :IL_AutoIt_1:

такая задача,
есть исходный файл, test.m3u,оттуда надо взять 3-ю и 5-ю строку, но не всю,
а только от второй точки до двоеточия
92e1ad4241605d20bd0335e21.jpg

после чего,взятым из третьей строки надо заменить все адреса в файле my.m3u
при этом 3-я будет соответствовать группе (ns-1), а 5-я группе (bur-1)
1774eb2114925ba81de6f5b2c.jpg

первых два сегмента ip адреса остаются неизменными..
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Если я правильно понял условия задачи, то пробуйте
Код:
$sTest = '#EXTM3U' & @CRLF & _
			'EXTINF:0,(ns-1)Россия 24' & @CRLF & _
			'http://154.29.14.78:1234/upd/233.7.70.68:5000' & @CRLF & _
			'EXTINF:0,(bur-1)Россия 24' & @CRLF & _
			'http://88.122.240.19:1234/upd/233.7.70.68:5000'
$ns = 'ns-1'
$bur = 'bur-1'
$sPattern = '.*?http:\/\/\d{1,3}\.\d{1,3}\.)(\d{1,3}\.\d{1,3})(:)'
$sPattern_ns = '(?s)(' & $ns & $sPattern
$s_ns = StringRegExp($sTest, $sPattern_ns, 3)
;~ ConsoleWrite($s_ns[0] & @LF & $s_ns[1] & @LF & $s_ns[2] & @LF & @LF)

$sPattern_bur = '(?s)('& $bur & $sPattern
$s_bur = StringRegExp($sTest, $sPattern_bur, 3)
;~ ConsoleWrite($s_bur[1] & @LF)

$sMy = 	'EXTINF:0,(ns-1)Кинопоказ' & @CRLF & _
		'http://154.29.14.78:1234/upd/233.7.70.68:5000' & @CRLF & _
		'EXTINF:0,(bur-1)Первый HD' & @CRLF & _
		'http://88.122.240.19:1234/upd/233.7.70.68:5000' & @CRLF & _
		'EXTINF:0,(bur-1)ТВЦ' & @CRLF & _
		'http://88.122.240.19:1234/upd/233.7.70.68:5000'
$sMy = StringRegExpReplace($sMy, $sPattern_ns, '${1}' & $s_ns[1] & '${3}')
$sMy = StringRegExpReplace($sMy, $sPattern_bur, '${1}' & $s_bur[1] & '${3}')
ConsoleWrite($sMy & @LF)
И просьба, на будующие, не надо скринов, лучше скопируйте в текстовом формате. А то сидеть со скрина перебивать как-то не очень.
 
Автор
M

mikzin

Новичок
Сообщения
80
Репутация
0
спасибо, конечно, вам плюс.
но я уже вижу, вы неверно поняли задачу..
там не надо ничего перебивать руками.
я уже сам полвину задачи решил, даже без регулярок.. :whistle:
итак, чтение 3-го и 4-го сегмента ип,
вот так:

Код:
$hFile = FileOpen('C:\Users\Dmitry\Desktop\Test.m3u', 0)
If $hFile = -1 Then
    MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
    Exit
EndIf

$sRet = FileReadLine($hFile, 3)
$sPos1 = StringInStr($sRet, '.', 0, 2)
$sRet = StringMid($sRet, $sPos1+1, 9)
$ns1 = StringLeft($sRet, StringInStr($sRet, ":") - 1)
;; вот уже имеем первые данные
$sRet = FileReadLine($hFile, 5)
$sPos1 = StringInStr($sRet, '.', 0, 2)
$sRet = StringMid($sRet, $sPos1+1, 9)
$bur1 = StringLeft($sRet, StringInStr($sRet, ":") - 1)
;;а вот и вторые
FileClose($hFile)


далее нужно записать в сущ. файл эти два значения
$ns1 и $bur1, где уже все есть, все каналы, и все адреса....
под спойлер ложу урезанный файл, куда они должны записываться..::

а вот откуда читаем ('C:\Users\Dmitry\Desktop\Test.m3u'):
 

Вложения

  • Test.m3u.txt
    156 байт · Просмотры: 9
  • my.m3u.txt
    739 байт · Просмотры: 16

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
#include <File.au3>
$sPattern = '((\d{1,3}\.\d{1,3}):)'
$ns = StringRegExp(FileReadLine('test.m3u', 3), $sPattern, 3)
$bur = StringRegExp(FileReadLine('test.m3u', 5), $sPattern, 3)
$fr = FileReadToArray('my.m3u')
For $i = 0 To UBound($fr) - 1
	If StringInStr($fr[$i], '(ns-1)') Then
		$i += 1
		$fr[$i] = StringRegExpReplace($fr[$i], $sPattern, $ns[0], 1)
	EndIf
	If StringInStr($fr[$i], '(bur-1)') Then
		$i += 1
		$fr[$i] = StringRegExpReplace($fr[$i], $sPattern, $bur[0], 1)
	EndIf
Next
_FileWriteFromArray('my.m3u', $fr)
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Я как раз и просил, чтобы дали данные. Так как руками их пришлось набирать для проверки.
Вот тоже самое с файлами
Код:
$sTest = FileRead('Test.m3u.txt')
$ns = 'ns-1'
$bur = 'bur-1'
$sPattern = '.*?http:\/\/\d{1,3}\.\d{1,3}\.)(\d{1,3}\.\d{1,3})(:)'
$sPattern_ns = '(?s)(' & $ns & $sPattern
$s_ns = StringRegExp($sTest, $sPattern_ns, 3)

$sPattern_bur = '(?s)('& $bur & $sPattern
$s_bur = StringRegExp($sTest, $sPattern_bur, 3)

$sMy = FileRead('my.m3u.txt')
$sMy = StringRegExpReplace($sMy, $sPattern_ns, '${1}' & $s_ns[1] & '${3}')
$sMy = StringRegExpReplace($sMy, $sPattern_bur, '${1}' & $s_bur[1] & '${3}')
ConsoleWrite($sMy & @LF)
FileWrite('my1.m3u.txt', $sMy)
Надеюсь проверку на наличие файлов сможете прикрутить. Просто я не стал делать, чтобы не заграмождать сам пример.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
До кучи и мой вариант.
Код:
;~ без проверок на ошибки!
Local $sDir = @ScriptDir, $aFiles[2][3] = [['Test.m3u'],['my.m3u']], $aFind[2][2] = [['ns-1'],['bur-1']], _
		$aPat[2][2] = [['(?s).*\Q', '\E.*?\.(\d{1,3}\.\d{1,3}):.*'],['(?s)(\Q', '\E.*?\.)(\d{1,3}\.\d{1,3})(:)']]

If @WorkingDir <> $sDir Then FileChangeDir($sDir)
For $i = 0 To 1
	$aFiles[$i][2] = FileOpen($aFiles[$i][0], FileGetEncoding($aFiles[$i][0]))
	$aFiles[$i][1] = FileRead($aFiles[$i][2])
	FileClose($aFiles[$i][2])
	If $i Then
		For $j = 0 To 1
			$aFiles[$i][1] = StringRegExpReplace($aFiles[$i][1], $aPat[1][0] & $aFind[$j][0] & $aPat[1][1], '${1}' & $aFind[$j][1] & '$3')
		Next
	Else
		For $j = 0 To 1
			$aFind[$j][1] = StringRegExpReplace($aFiles[$i][1], $aPat[0][0] & $aFind[$j][0] & $aPat[0][1], '$1')
		Next
	EndIf
Next
$aFiles[0][2] = FileOpen('New_' & $aFiles[1][0], FileGetEncoding($aFiles[1][0]) + 2)
FileWrite($aFiles[0][2], $aFiles[1][1])
FileClose($aFiles[0][2])
 
Автор
M

mikzin

Новичок
Сообщения
80
Репутация
0
ух ты, класс :D
всем спасибо, в виде +.

joiner, ваш вариант кажется наиболее изящным, и его я хотел использовать... но, тут возникла ошибка:

Код:
$fr = FileReadToArray('my.m3u')

здесь наверное должно быть _FileReadToArray, но и после исправления идет ошибка, мол используется переменная до ее об#явления.
беда :(

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

P.S. для записи файла в UTF-8 нужны какие-то особые параметры?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
mikzin
AutoIT 3.3.12.0
у меня все работает отлично. для данного примера обязательно наличие двух файлов с содержанием - Test.m3u и My.m3u
то есть файлы из твоего сообщения только с расширением .m3u
 
Автор
M

mikzin

Новичок
Сообщения
80
Репутация
0
joiner сказал(а):
mikzin
AutoIT 3.3.12.0
у меня все работает отлично. для данного примера обязательно наличие двух файлов с содержанием - Test.m3u и My.m3u
то есть файлы из твоего сообщения только с расширением .m3u
файлы то есть, конечно..
у меня v3.3.8.1, как показывает хелп..
значит мне надо переустановить все?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
mikzin
для твоей версии языка
Код:
#include <File.au3>
$sPattern = '((\d{1,3}\.\d{1,3}):)'
$ns = StringRegExp(FileReadLine('test.m3u', 3), $sPattern, 3)
$bur = StringRegExp(FileReadLine('test.m3u', 5), $sPattern, 3)
Local $array
_FileReadToArray('my.m3u', $array)
For $i = 1 To $array[0]
	If StringInStr($array[$i], '(ns-1)') Then
		$i += 1
		$array[$i] = StringRegExpReplace($array[$i], $sPattern, $ns[0], 1)
	EndIf
	If StringInStr($array[$i], '(bur-1)') Then
		$i += 1
		$array[$i] = StringRegExpReplace($array[$i], $sPattern, $bur[0], 1)
	EndIf
Next
_FileWriteFromArray('my.m3u', $array, 1)
 
Автор
M

mikzin

Новичок
Сообщения
80
Репутация
0
благодарю, я уже поставил посл. версию.
однако, беда - там по вашему первонач. варианту вместо русских названий какие-то нечитаемые символы..
видимо там надо запись делать в UTF-8, а пишет в ANSI..
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
да, пишет по умолчанию - ANSI. но проблем с чтением не было
вот содержимое My.m3u после обработки
Код:
#EXTM3U
#EXTINF:0,(ns-1)Россия 24
http://19.77.13.44:1234/udp/233.7.70.68:5000
#EXTINF:0,(ns-1)Первый HD
http://19.77.13.44:1234/udp/233.7.70.200:5000
#EXTINF:0,(ns-1)Россия HD
http://19.77.13.44:1234/udp/233.7.70.201:5000
все читаемо. открывал в стандартном блокноте
если нужно открыть в кодировке, то примерно так
Код:
#include <File.au3>
$sPattern = '((\d{1,3}\.\d{1,3}):)'
$inf = FileOpen('test.m3u',256); UTF 8
$ns = StringRegExp(FileReadLine($inf, 3), $sPattern, 3)
$bur = StringRegExp(FileReadLine($inf, 5), $sPattern, 3)
FileClose($inf)
$outf = FileOpen('my.m3u',256);UTF 8
$fr = FileReadToArray($outf)
For $i = 0 To UBound($fr) - 1
    If StringInStr($fr[$i], '(ns-1)') Then
        $i += 1
        $fr[$i] = StringRegExpReplace($fr[$i], $sPattern, $ns[0], 1)
    EndIf
    If StringInStr($fr[$i], '(bur-1)') Then
        $i += 1
        $fr[$i] = StringRegExpReplace($fr[$i], $sPattern, $bur[0], 1)
    EndIf
Next
FileClose($outf)
$outf = FileOpen('my.m3u',258);UTF 8
_FileWriteFromArray($outf, $fr)
FileClose($outf)
 
Автор
M

mikzin

Новичок
Сообщения
80
Репутация
0
joiner сказал(а):
если нужно открыть в кодировке, то примерно так
Код:
#include <File.au3>
$sPattern = '((\d{1,3}\.\d{1,3}):)'
$inf = FileOpen('test.m3u',256); UTF 8
$ns = StringRegExp(FileReadLine($inf, 3), $sPattern, 3)
$bur = StringRegExp(FileReadLine($inf, 5), $sPattern, 3)
FileClose($inf)
$outf = FileOpen('my.m3u',256);UTF 8
$fr = FileReadToArray($outf)
For $i = 0 To UBound($fr) - 1
    If StringInStr($fr[$i], '(ns-1)') Then
        $i += 1
        $fr[$i] = StringRegExpReplace($fr[$i], $sPattern, $ns[0], 1)
    EndIf
    If StringInStr($fr[$i], '(bur-1)') Then
        $i += 1
        $fr[$i] = StringRegExpReplace($fr[$i], $sPattern, $bur[0], 1)
    EndIf
Next
FileClose($outf)
$outf = FileOpen('my.m3u',258);UTF 8
_FileWriteFromArray($outf, $fr)
FileClose($outf)
после этого, вот такая пись-пись получается :D
72df1a943df109868b1e336cc21.jpg

и, соответственно в плеере :shok:
69c8e4159f90d10f87f4aefbe.jpg

чяднт?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
mikzin
прикрепи оригинальные файлы, в том виде, как они создаются программой



Добавлено:
Сообщение автоматически объединено:

пришлось установить этот плеер. нашел в сети файл плейлиста. он в кодировке - 256 (UTF8)
переписал его последним своим примером. плеер корректно отобразил имена
файлы, которые ты прикрепил в кодировке ANSI
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Добавил в свой вариант определение кодировки.

PS
joiner, мой во всех версиях без переделки работает. :blum:
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
madmasles [?]
мой во всех версиях без переделки работает.
враки :smile:
примеры плейлистов, которые прикрепил автор темы, в кодировке ANSI. на выходе ваш код дает такую же кодировку. плеер VLC, фото которого предоставил автор темы, читает плейлисты в кодировке UTF-8(256). а значит ваш код так же на выходе даст кракозябры в плеере
 
Автор
M

mikzin

Новичок
Сообщения
80
Репутация
0
madmasles сказал(а):
Добавил в свой вариант определение кодировки.
тестил, вообще ничего не происходит.
правда я заменил переменную
@ScriptDir
на
'C:\Users\Dmitry\Desktop'

жесть, теперь руками переписывать.. :(
 
Верх