Что нового

Сохранение файлов в каталоги по условиям из txt

reptop1

Новичок
Сообщения
2
Репутация
0
Прошу помочь, я новичек в работе с программой, поэтому просьба строго не судить.
Имеется два txt файла, один содержит имена файлов(получен батником в корне папки, т.е. содержит список всех файлов в текстовом виде), другой содержит путь к каталогам (с которыми нужно сопоставить и сохранить при нахождении).
Задача такая, чтобы зайти в файл с именами, выдернуть из нее определенную часть, согласно маске, и получившийся результат поискать во втором txt файле. Если он найдет совпадение, то должен создать какой нибудь файл по этому каталогу, если не найдет, то просто закинуть в папку "несортированны".

1й txt файл (песни.txt) имеет имена, к примеру: Кино - Восьмиклассница
2й txt файл (пути.txt) имеет следующий текст: Кино;H:\Сортировано\Русские\К\Кино (Цой Виктор)\;

Делаю так:
Код:
$sKatalog = FileRead("H:\музыка\песни.txt") 		;открываем файл для чтения
                $song_name = FileReadLine($sKatalog )
		$song_name_split= StringSplit($song_name," - ",1)  	; получаем две переменные "Кино" и "Восьмиклассница"
		$path = "H:\музыка\пути.txt"
		$aLines = StringSplit($path ,";"&@CRLF,1)		; В файле $path данные хранятся в виде "Кино;H:\Обновления\Сортировано\Русские\К\Кино (Цой Виктор)\;" Разбиваем на переменные "Кино" и "H:\Обновления\Сортировано\Русские\К\Кино (Цой Виктор)\"
		$sNotSorted = "H:\музыка\Несортированные\"
		
		For $x = 1 To $aLines[0] Step +1
			$sSorted = StringRegExpReplace($aLines[$x],$song_name_split[1]&";","")  ;   Ищем "Кино" в файле "Пути.txt", удаляя при этом само название группы и знак ;, чтобы оставить только путь каталога
		    If StringInStr($aLines[$x], $sSearched)<>@error  Then			; Если ошибки нет, то путь прописывается H:\Сортировано\Русские\К\Кино (Цой Виктор)\
			 	DirCreate ($sSorted)
				$sFinalPath = $sSorted  ;При выполнении условия значение - H:\Сортировано\Русские\К\Кино (Цой Виктор)\
			Else
				DirCreate ($sNotSorted )
				$sFinalPath = $sNotSorted  ; при невыполнении условия значение - H:\музыка\Несортированные\
		    EndIf
		Next

		FileCopy($song_name&".mp3",$sFinalPath)  ;файл mp3 лежит в этом же каталоге, копируем его в финальный каталог, в нашем случае H:\Сортировано\Русские\К\Кино (Цой Виктор)\Кино - Восьмиклассница.mp3



По итогу, при условии что имя исполнителя из первого файла есть в во втором файле, то вроде все работает хорошо, но если исполнителя во втором файле нет, то он все равно пишет в папку Кино (Цой Виктор)
Где я ошибся?
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Похоже, что Вы создали пример не тот, с которым работаете. Этот работать так, ка Вы описали не будет.
Код:
$path = "H:\музыка\пути.txt"
        $aLines = StringSplit($path ,";"&@CRLF,1)       ;Разбиваем на переменные "Кино" и "H:\Обновления\Сортировано\Русские\К\Кино (Цой Виктор)\"
; окуда из пути $path возьмётся "Кино" и "H:\Обновления\Сортировано\Русские\К\Кино (Цой Виктор)\" ?
;....................................................
;Зачем этот цикл ?
For $x = 1 To $aLines[0] Step +1
;..................................................
;Здесь вместо "," поставили ";"
 FileCopy($song_name&".mp3";$sFinalPath)  ;файл mp3 лежит в этом же каталоге, копируем его в финальный каталог, в нашем случае H:\Сортировано\Русские\К\Кино (Цой Виктор)\Кино - Восьмиклассница.mp3  
;Замените на
 FileCopy($song_name&".mp3",$sFinalPath)


Это то, что сразу в глаза бросается, а вообще - я бы читал оба файла в массив и работал бы уже с массивами .
 
Автор
R

reptop1

Новичок
Сообщения
2
Репутация
0
Может поможете найти правильное решение на основании задачи:
1) Есть папка, в ней много mp3 файлов.
2) Есть батник с помощью которого был получен список этих файлов и записан в этот же каталог с наименование songs.txt (в нем весь список файлов каталога), примерное содержимое файла
Кино - Восьмиклассница
A-Dessa - ТипаНазваниеПесни
и т.п.

3) Есть готовая структура каталогов (так же в txt формате) по многим исполнителям в алфавитном порядке, к нашему примеру относится
Примерное содержимое файла: Файл, допустим называется, path.txt
Кино;H:\Музыка\Русские\К\Кино (Виктор Цой\
A-Dessa;H:\Музыка\Русские\A\A-Dessa (Костюшкин)
и т.п.

Задача такая, чтобы скрип просканировал файл с названиями песен (songs.txt), далее по имени исполнителя начал бы искать, есть ли у него готовый каталог в файле path.txt, и если есть, то переместил песню из корневой папки по найденному пути. Если не нашел в path.txt каталог, то скинул файл в папку "Неотсортировано".

Грубо говоря мне на выходе нужно бы получить переменную, допустим,
msgbox (0,'Сообщение',$result)
, которое даст сообщение либо "H:\Музыка\Русские\К\Кино (Виктор Цой\" при поиске по критерию "Кино",
либо если в каталоге $path его бы не было, то тут уже выдало бы: "H:\Музыка\Неоотсортировано\"
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
, которое даст сообщение либо "H:\Музыка\Русские\К\Кино (Виктор Цой\" при поиске по критерию "Кино",
либо если в каталоге $path его бы не было, то тут уже выдало бы: "H:\Музыка\Неоотсортировано\"
Набросал на скорую руку, примерно так можно :
Код:
$FirstFile = '1.txt'
$SecondFile = '2.txt'

$aKatalog = FileReadToArray($FirstFile)
$aPath = FileReadToArray($SecondFile)

For $i = 0 To UBound($aKatalog) - 1
	$result = "H:\музыка\Несортированные\"
	$sName = StringRegExp($aKatalog[$i], '(?m)(.*)(?: - )', 1)
	If Not @error Then
		For $j = 0 To UBound($aPath) - 1
			$aKatalogName = StringSplit($aPath[$j], ';')
			If $aKatalogName[1] = $sName[0] Then
				$result = $aKatalogName[2]
				ContinueLoop
			EndIf
		Next
	EndIf
	MsgBox(0, $sName[0], $result)
Next
 
Верх