Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Contributor


Сообщения: 2715
Благодарности: 1688

Профиль | Отправить PM | Цитировать


Sta1917,
Здесь вариант, где я постарался по максимуму учесть Ваши пожелания
Код: Выделить весь код
@Echo Off
cls

SetLocal EnableExtensions EnableDelayedExpansion

:Путь к папке, где расположены Box_In, Box_Out, Box_Arc
:::Set "Where=Z:\tralala"
Set "Where="

:Маски файлов
Set "Files=*.txt *.csv"

:Список возможных разделителей
Set "Delim=;,."

:Шаблон заголовка
Set "Str00=Name Latitude Longitude Description"

:Путь к программе gpsbabel
If Exist "%ProgramFiles%\GPSBabel\gpsbabel.exe" Set gpsbabel="%ProgramFiles%\GPSBabel\gpsbabel.exe" -w -i unicsv -f
If Exist "%ProgramFiles(x86)%\GPSBabel\gpsbabel.exe" Set gpsbabel="%ProgramFiles(x86)%\GPSBabel\gpsbabel.exe" -w -i unicsv -f

:Путь к программе Iconv
Set "Iconv=.\iconv\iconv.exe"

:Если батник запускаем с параметрами
If Not "%~1"=="" (
	Echo ----------------------------------------------
	Set "Files=%1" & Echo 1 %1
	If Not "%~2"=="" Set "Files=!Files! %2" & Echo 2 %2
	If Not "%~3"=="" Set "Files=!Files! %3" & Echo 3 %3
	If Not "%~4"=="" Set "Files=!Files! %4" & Echo 4 %4
	If Not "%~5"=="" Set "Files=!Files! %5" & Echo 5 %5
	If Not "%~6"=="" Set "Files=!Files! %6" & Echo 6 %6
	If Not "%~7"=="" Set "Files=!Files! %7" & Echo 7 %7
	If Not "%~8"=="" Set "Files=!Files! %8" & Echo 8 %8
	If Not "%~9"=="" Set "Files=!Files! %9" & Echo 9 %9
	Echo ----------------------------------------------
	Echo Press Enter to continue or Ctrl/C to abort
	Pause >nul
)

:Определение числа возможных разделителей
FOR /L %%d IN (0,1,255) DO (
	Set Dlm=!Delim:~%%d,1!
	If "!Dlm!"=="" GoTo :Cont1
	Set /A Nd=%%d
)
:Cont1

:Делаем рабочие папки если их нет. Если расположение не указано, работаем в папке с батником
If "%Where%"=="" Set "Where=%~dp0" & Set "Where=!Where:~0,-1!"
Md "%Where%\Box_In" 2>nul
Md "%Where%\Box_Out" 2>nul
Md "%Where%\Box_Arc" 2>nul

Pushd "%Where%\Box_In"
Del *.tmp 2>nul

If "%~1"=="" (
	For %%f in (%Files%) Do Call :Text "%Where%\Box_In\%%f"
) Else (
	For %%f in (%Files%) Do Call :Text "%%~f"
)

Pause

Popd
GoTo :Eof

:Separ
: Поиск символа разделителя в строке

Set "Str=%~1"
FOR /L %%s IN (0,1,255) DO (
	Set "Str=%~1"
	Set "Sep=!Str:~%%s,1!"
	If "!Sep!"=="" (
		Set "%~2= "
		Set "%~3=%Str00%"
		GoTo :Eof
	) Else (
		FOR /L %%d IN (0,1,%Nd%) DO (
			Set "%~2=!Delim:~%%d,1!"
			If !%~2!==!Sep! (
				Set "%~3=%Str00: =!Sep!%"
				GoTo :Eof
			)
		)
	)
)
GoTo :Eof

:Text

FOR /F "usebackq delims=" %%i IN (%1) DO (
	Set /A Str=0
	Set "String=%%i"
        Set "String=!String: =!"

	Call :Separ "!String!" "Dlm" "Head"

	If /I Not "!String!"=="!Head!" ( 
		>"%~1.tmp" Echo !Head!
		>>"%~1.tmp" type %1
	) Else (
		>"%~1.tmp" type %1
	)
	"%Iconv%" -t UTF-8 "%~1.tmp" >"%Where%\Box_Out\%~nx1"
	%gpsbabel% "%Where%\Box_Out\%~nx1" -o kml -F "%Where%\Box_Out\%~n1.kml"

rem Имитация программы Iconv  
rem 	Echo "%Iconv%" -t UTF-8 "%~1.tmp" ^>"%Where%\Box_Out\%~nx1"
rem 	Copy "%~1.tmp" "%Where%\Box_Out\%~nx1"
rem Имитация программы gpsbabel
rem 	Echo %gpsbabel% "%Where%\Box_Out\%~nx1" -o kml -F "%Where%\Box_Out\%~n1.kml"
rem 	Copy "%Where%\Box_Out\%~nx1" "%Where%\Box_Out\%~n1.kml"

	Move /Y %1 "%Where%\Box_Arc\" >nul
	Del "%~1.tmp"
	Del "%Where%\Box_Out\%~nx1"
	GoTo :Eof
)

GoTo :Eof
Здесь пояснения к этому варианту

Мысли по организации процесса: В параметре Where должна быть прописана папка, где расположены данные, распределённые по папкам: Box_In, Box_Out, Box_Arc. Если строка пустая, как сейчас в примере, то подразумевается, что эти папки расположены в той же папке, что и батник. Если батник запускается без параметров, то исходные данные берутся из Box_In. Шаблоны обрабатываемых файлов задаются в параметре Files. Если в параметрах имена файлов, то обрабатываются они. В частности, если на рабочем столе создать значок со ссылкой на батник, а затем пометить в папке с данными несколько файлов (не более 9!) и затянуть их на этот значок, то обработаются помеченные файлы. Результаты - в подпапке Box_Out указанной папки в параметре Where. Данные из исходного места перемещаются в Box_Arc. Исходные данные не изменяются.
Разделители: Список разрешенных задаётся строкой параметра Delim. Разделитель из нескольких символов, в частности, запятая с пробелом, точка с запятой с пробелом мной не рассматривались. Ограничение: в данных первого поля не должно быть символов из списка разделителей, иначе возможно неверное определение разделителя полей. Шапка задаётся шаблоном в параметре Str00. В шаблоне наименования полей перечислены через пробел, при отсутствии в файле шапки, для обработки шапка добавляется в промежуточный файл с разделителем, взятым из первой строки, если он содержится в списке возможных разделителей.
У меня нет программ Iconv и gpsbabel, поэтому я использовал для отладки их имитации посредством команды copy. Реально конвертация мной не отлаживалась.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 06-07-2016 в 17:13.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:07, 06-07-2016 | #9