Что нового

Сравнение файлов txt и csv и запись в новый csv файл

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
Добрый день.
Задача: сравнить содержимое папки с картинками с файлом csv, при совпадении записать в конец нового файла через разделитель ^ имя картинки с расширением. (В csv записаны наименования товара, в папке фото этих товаров, с именами файлов как у товара)
Что получилось:

Код:
#include<File.au3>

$Picture_Path = 'D:\csv\picture\'
$Text_Path = 'D:\csv\'


$Csv_File_Open = FileOpen($Text_Path & "Produkt.csv", 0)

$Txt_File_Open = FileOpen($Text_Path & "Files_name.txt", 1)
$sFileList = _FO_FileSearch($Picture_Path, '*.jpg', True, 0, 3, 0, 0)
FileWrite ($Txt_File_Open, $sFileList)
FileClose($Txt_File_Open)


$Txt_File_Open = FileOpen($Text_Path & "Files_name.txt", 0)

While 1
    $Txt_Line = FileReadLine($Txt_File_Open)
    If @error = -1 Then ExitLoop

	While 2

			$Csv_Line = FileReadLine($Csv_File_Open)
			If @error = -1 Then ExitLoop
			$check = StringInStr ($Txt_Line, $Csv_Line, 2)
			If $Txt_Line = $Csv_Line Then
				$Result_File = FileOpen($Text_Path & "Import_picture.csv", 1)
				FileWriteLine ($Result_File, $Csv_Line & '^' & $Txt_Line & '.jpg')
				FileClose($Result_File)
			EndIf
	WEnd

WEnd
FileClose($Txt_File_Open)
FileClose($Csv_File_Open)


Что не получилось:
1) При нахождении первого совпадения скрипт закрывается, прекращая поиск (первое найденное совпадение записывает корректно).
2) Если название картинки на русском, в файле Files_name.txt получается абракадабра (понимаю, что кодировка должна быть UTF-8, но как сделать не знаю).

помогите с реализацией :'( :'(
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Пример этих файлов можете выложить ?
Забыли библиотеку прицепить "#Include <FileOperations.au3>" для "_FO_FileSearch()"
Попробуйте этот вариант ( проверить нет возможности из-за отсутствия файлов для сравнения)
Код:
#include <File.au3>
#include <FileOperations.au3>

$Picture_Path = 'D:\csv\picture\'
$Text_Path = 'D:\csv\'
$Result_File = 'D:\csv\result.csv';Файл результата поиска
;Создать файл результата, если его нет
If Not FileExists($Result_File) Then _FileCreate($Result_File)

$sFileList = _FO_FileSearch($Picture_Path, '*.jpg', True, 0, 3, 0, 0)
If @error Then Exit MsgBox(48, 'Ошибка !', 'Ошибка чтения списка файлов !', 3)

;Открыть файл результата для записи в конец файла
$Res_File_Open = FileOpen($Result_File, 1)

Local $aCsvArray;Массив для чтения csv файла
_FileReadToArray($Text_Path & "Files_name.txt", $aCsvArray)
If Not @error Then

	For $i = 1 To $sFileList[0]
		$FileName = $sFileList[$i]
		For $y = 1 To $aCsvArray[0]
			If StringInStr($aCsvArray[$y], $FileName) Then
				;Запись имени файла в файл результата
				FileWriteLine($Res_File_Open, $aCsvArray[$y] & '^' & $FileName & '.jpg')
				;Переход к следующему файлу, если совпадение может быть только одно
				ContinueLoop
			EndIf
		Next
	Next

EndIf
FileClose($Res_File_Open)
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
Файл csv:


Содержимое папки с картинками:



Попробовал Ваш вариант, файл result.csv создается, но он нулевой, Files_name.txt не создается. Попробовал со своим Files_name.txt, результат тот же, результирующий файл нулевой.

Немного поправил, но результат не изменился.
Код:
#include <File.au3>
#include <FileOperations.au3>

$Picture_Path = 'D:\csv\picture\'
$Text_Path = 'D:\csv\'
$Result_File = 'D:\csv\result.csv';Файл результата поиска
;Создать файл результата, если его нет
If Not FileExists($Result_File) Then _FileCreate($Result_File)

;~ Чтение каталога с картинками (расширение файлов не выводится в результат)
$sFileList = _FO_FileSearch($Picture_Path, '*.jpg', True, 0, 3, 0, 0)
If @error Then Exit MsgBox(48, 'Ошибка !', 'Ошибка чтения списка файлов !', 3)

;~ Открытие файла для выгрузки имен картинок, и запись в него
$Txt_File_Open = FileOpen($Text_Path & "Files_name.txt", 1)
FileWrite ($Txt_File_Open, $sFileList)
FileClose($Txt_File_Open)


;Открыть файл результата для записи в конец файла
$Res_File_Open = FileOpen($Result_File, 1)
FileWriteLine($Result_File, 'product_name^file_url') ;запись первой строки с названиями полей

Local $aCsvArray;Массив для чтения csv файла
_FileReadToArray($Text_Path & "Files_name.txt", $aCsvArray)
If Not @error Then

    For $i = 1 To $sFileList[0]
        $FileName = $sFileList[$i]
        For $y = 1 To $aCsvArray[0]
            If StringInStr($aCsvArray[$y], $FileName) Then
                ;Запись имени файла в файл результата
                FileWriteLine($Res_File_Open, $aCsvArray[$y] & '^' & $FileName & '.jpg')
                ;Переход к следующему файлу, если совпадение может быть только одно
                ContinueLoop
            EndIf
        Next
    Next

EndIf
FileClose($Res_File_Open)
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Посмотрите, что он читает в массивы , обратите внимание на массив из csv файла - там не должно быть кроме названия ьольше ничего, иначе нужно будет отбросить лишнее.
Мой вариант со второго поста + показывает массивы для проверки:


Files_name.txt не создается
Так Вы его и не создаёте. Пытаетесь открыть, а его нет. А зачем он вам ? ведь всё содержимое этого файла в массиве есть.

Вот вариант без функции "_FO_FileSearch" (На работе работала, на домашнем не хочет , не стал долго заморачиваться - написал по-другому) и плюс выше ошибка была в строке "_FileReadToArray($Text_Path & "Files_name.csv", $aCsvArray)" читал из файла txt , а нужно csv :-[
Код:
#include <File.au3>

$Picture_Path = 'D:\csv\picture'
$Text_Path = 'D:\csv\'
$Result_File = 'D:\csv\result.csv';Файл результата поиска
;Создать файл результата, если его нет
If Not FileExists($Result_File) Then _FileCreate($Result_File)

;Чтение списка файлов с расширениями
$sFileList = _FileListToArray($Picture_Path, '*.jpg', 1)
If @error Then Exit MsgBox(48, 'Ошибка !', 'Ошибка чтения списка файлов №' & @error, 3)

;Открыть файл результата для записи в конец файла
$Res_File_Open = FileOpen($Result_File, 1 + 128)

Local $aCsvArray;Массив для чтения csv файла
_FileReadToArray($Text_Path & "Files_name.csv", $aCsvArray)
If Not @error Then

	For $i = 1 To $sFileList[0]
		; Убрать расширения
		$FileName = StringRegExpReplace($sFileList[$i], '^(?:.*\\)?([^\\]*?)(?:\.[^.]+)?$', '\1')
		For $y = 1 To $aCsvArray[0]
			If StringInStr($aCsvArray[$y], $FileName) Then
				;Запись имени файла в файл результата
				FileWriteLine($Res_File_Open, $aCsvArray[$y] & '^' & $FileName & '.jpg')
				;Переход к следующему файлу, если совпадение может быть только одно
				ContinueLoop
			EndIf
		Next
	Next

EndIf
FileClose($Res_File_Open)
И файл "Files_name.txt" не создавал, так как не пойму - зачем он нужен... если принципиально- можно дописать...
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
Всё замечательно заработало. :laugh: :laugh:
У Вас было:
Код:
_FileReadToArray($Text_Path & "Files_name.csv", $aCsvArray)

А нужно:
Код:
_FileReadToArray($Text_Path & "Produkt.csv", $aCsvArray)


Список товара в Produkt.csv лежит.
 
Верх