CMD/BAT - Текстовые файлы

Аватара пользователя
AKadekin

Re: CMD/BAT - Текстовые файлы

Сообщение AKadekin »

Цитата AKadekin:



Да, обрабатывается 1 файл. Имя этих файлов разное но расширение одно.
CMD/BAT - Текстовые файлы




[когнитивный диссонанс ON]

Он либо один, либо этих файлов больше чем один. Это взаимоисключающие условия.

[когнитивный диссонанс OFF]




Цитата AKadekin:



Файлы находятся в одной папке потом они перемещаются в разные папки.

Файлы которые нужно обработать имеют расширения *.AX1 и *.MX1 и они находятся в одной папке.

После обработки перед перемещением их нужно переименовать в *.MIX (бывший *.AX1 - ложится в одну папку, другой в другую)

Эти файлы содержат разные данные но "структура" одинаковая. В этих файлах нужно перед знаком ] убрать пробел. Там всегда один пробел лишний.

Расположение папок фиксировано не меняется.

Все что нужно.
CMD/BAT - Текстовые файлы




powershell



Код:

Код: Выделить всё

#requires -v 3.0
# путь к одному каталогу с файлами:
$fldin = 'z:\Путь_к_каталогу_с_файлами\Один_Каталог\*'
# путь к разным, целевым каталогам:
$fldout1 = 'z:\Путь_к_каталогу_с_файлами\AX1'
$fldout2 = 'z:\Путь_к_каталогу_с_файлами\MX1'
# если не существуют, то создаем:
if(!(test-path $fldout1)){md $fldout1|out-null}
if(!(test-path $fldout2)){md $fldout2|out-null}
# фильтр файлов по расширению:
$inc = '*.AX1','*.MX1'
# расширение для переименования:
$ext = '.MIX'
# кодировка:
$enc = 'utf8'
dir $fld -inc $inc -file|%{
	$file = $_
	$tmp = (gc $_.fullname -raw -enc $enc) -replace ' \]',']'
	$tmp|sc $file.fullname -enc $enc
	if ($_.extension -eq '.AX1'){
		mi $_.fullname ("$fldout1\" + $_.basename + $ext)
	} else {
		mi $_.fullname ("$fldout2\" + $_.basename + $ext)
	}
}
Аватара пользователя
Iska

Re: CMD/BAT - Текстовые файлы

Сообщение Iska »

Это пример одного файлов они по структуре похоже, отличаются только внутренними данными.





Код:

Код: Выделить всё

[Descrittore]
Nome=1023022
Descrizione=Klaes
Id=1
Numero record=27  
Ora di Inizio=01/01/2001 23.23.59
Ora di Fine=01/01/2001 23.23.59
[TEIL]
[Record Nr.0 ]
Nr.Riga=1 
Id.Record=3014
Lunghezza=662.0 
Larghezza=102.0
Spessore=58.0
Quantita=1
Fattil1=0
Fattil2=0
Аватара пользователя
AKadekin

Re: CMD/BAT - Текстовые файлы

Сообщение AKadekin »

Это пример одного файлов они по структуре похоже, отличаются только внутренними данными.





Код:

Код: Выделить всё

[Descrittore]
Nome=1023022
Descrizione=Klaes
Id=1
Numero record=27  
Ora di Inizio=01/01/2001 23.23.59
Ora di Fine=01/01/2001 23.23.59
[TEIL]
[Record Nr.0 ]
Nr.Riga=1 
Id.Record=3014
Lunghezza=662.0 
Larghezza=102.0
Spessore=58.0
Quantita=1
Fattil1=0
Fattil2=0
Аватара пользователя
megaloman

Re: CMD/BAT - Текстовые файлы

Сообщение megaloman »

AKadekin,


VBS. Пропишите свои пути

[spoiler]Код:
[/spoiler]

Код: Выделить всё

 FileIn = Array("Z:\Box_In", "AX1", "Z:\Box_Out1", "MIX", _
                "Z:\Box_In", "MX1", "Z:\Box_Out2", "MIX")
RegExp = "  *]"
Rep = "]"
NN = 4
N1 = LBound(FileIn)
N2 = UBound(FileIn)
ErrMsg = ""
For i = N1 To N2 Step NN
    Call Working(FileIn(i), FileIn(i + 1), FileIn(i + 2), FileIn(i + 3), RegExp, Rep, xDin, xOut, ErrMsg)
Next
'If ErrMsg  "" Then MsgBox ErrMsg
If ErrMsg  "" Then WScript.Echo ErrMsg
' =========================
Sub Working(Din, Ein, Dout, Eout, Rx, Rp, iDin, iDout, ErrM)
    Set FSO = CreateObject("Scripting.FileSystemObject")
    If ExistDir(FSO, Din, iDin, ErrM) And ExistDir(FSO, Dout, iOut, ErrM) Then
        Set RegFile = CreateObject("VBScript.RegExp")
        RegFile.Pattern = "^.*\." + Ein + "$"
        RegFile.IgnoreCase = True
        For Each jF In iDin.Files
            If RegFile.Test(jF.Name) Then
                If Retxt(FSO, jF, txt, Rx, Rp, ErrM) Then
                    Call Outtxt(FSO, jF, Dout + "\" + FSO.GetBaseName(jF) + "." + Eout, txt, ErrM)
                End If
            End If
        Next
    End If
End Sub
Function ExistDir(FSO, D, iD, ErrM)
    ExistDir = True
    On Error Resume Next
    Set iD = FSO.GetFolder(D)
    If Err.Number  0 Then
        ErrM = ErrM + "--- """ + D + """" + vbCrLf + "   Open folder. Err.Number=" + CStr(Err.Number) + "  " + Err.Description + vbCrLf
        ExistDir = False
    End If
    On Error GoTo 0
End Function
Function Retxt(FSO, fName, txt, RExp, RR, MS)
    Retxt = False
    On Error Resume Next
    With FSO.OpenTextFile(fName, 1)
        If Err.Number  0 Then
            MS = MS + "--- " + fName + vbCrLf + "    Error open file. Err.Number=" + CStr(Err.Number) + "  " + Err.Description + vbCrLf
            On Error GoTo 0
            Exit Function
        End If
        txt = .ReadAll
        If Err.Number  0 Then
            MS = MS + "--- " + fName + vbCrLf + "    Error read file. Err.Number=" + CStr(Err.Number) + "  " + Err.Description + vbCrLf
            On Error GoTo 0
            Exit Function
        End If
        .Close
    End With
    On Error GoTo 0
    With CreateObject("VBScript.RegExp")
        .Pattern = RExp
        .IgnoreCase = True
        .Global = True
        If Not .Test(txt) Then
''''''''''            MS = MS + "--- " + fName + vbCrLf + "    no replace." + "    Reg expression: " + """" + RExp + """" + vbCrLf
            Exit Function
        End If
        txt = .Replace(txt, RR)
    End With
    Retxt = True
End Function
Sub Outtxt(FSO, fIn, fOut, txt, MS)
    On Error Resume Next
    Set WW = FSO.CreateTextFile(fOut, True)
    If Err.Number  0 Then
            MS = MS + "--- " + fOut + vbCrLf + "    Error create file. Err.Number=" + CStr(Err.Number) + "  " + Err.Description + vbCrLf
            On Error GoTo 0
            Exit Sub
    End If
    WW.Write txt
    If Err.Number  0 Then
            MS = MS + "--- " + fOut + vbCrLf + "    Error write in file. Err.Number=" + CStr(Err.Number) + "  " + Err.Description + vbCrLf
            On Error GoTo 0
            WW.Close
            Exit Sub
    End If
    WW.Close
    Err.Number = 0
    If FSO.FileExists(fOut) Then Call FSO.DeleteFile(fIn, True)
    If Err.Number  0 Then
            MS = MS + "--- " + fIn + vbCrLf + "    Error delete file. Err.Number=" + CStr(Err.Number) + "  " + Err.Description + vbCrLf
            On Error GoTo 0
            Exit Sub
    End If
    On Error GoTo 0
End Sub





Лучше бы Вы заархивировали реальный файл и приложили к сообщению. Или, если он небольшой, переименуйте его в txt.
Аватара пользователя
AKadekin

Re: CMD/BAT - Текстовые файлы

Сообщение AKadekin »

В архиве находятся файлы
Daten.zip
Аватара пользователя
alpap

Re: CMD/BAT - Текстовые файлы

Сообщение alpap »

AKadekin,

если просто пробел мозолит глаза, не проще убрать [] везде по тексту, потому как пробелы в конце строк встречаются и в строках не имеющих этих скобок.

(да, и нужны ли 17 пробелов между абзацами?), т.е. как в дальнейшем будет использоваться этот файл?
Вложения
Daten.zip
(1.22 КБ) 0 скачиваний
Daten.zip
(1.22 КБ) 0 скачиваний
Аватара пользователя
megaloman

Re: CMD/BAT - Текстовые файлы

Сообщение megaloman »

Вот CMD. Пустые строки съест. VBS работает намного быстрее, но пустые строки сохраняет. Конкретно требований насчёт пустых строк не было. И концевых пробелов тоже

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@Echo Off
	Call :ReMove "Z:\Box_In\*.AF1" "Z:\Box_Out1" "MIX" " ]" "]"
	Call :ReMove "Z:\Box_In\*.AX1" "Z:\Box_Out2" "MIX" " ]" "]"
Exit /B
:ReMove
	For %%f In (%1) Do (
		>"%~2\%%~nf.%~3" (FOR /F "usebackq delims=" %%s IN (`2^>nul More "%%f"`) DO (
			Call :Replace "%%s" %4 %5
		))
		If Exist "%~2\%%~nf.%~3" Del "%%f"
	)
Exit /B
:Replace
	Set "SS=%~1"
	:Begin
		Set "SSS=%SS%"
		Call Set "SS=%%SS:%~2=%~3%%"
	If /I Not "%SSS%"=="%SS%" GoTo :Begin
	Echo %SS%
Exit /B
Аватара пользователя
AKadekin

Re: CMD/BAT - Текстовые файлы

Сообщение AKadekin »

Главное что бы до ] пробел убрать.

Структура должна быть сохранена и столько пробелов нужно.
Аватара пользователя
AKadekin

Re: CMD/BAT - Текстовые файлы

Сообщение AKadekin »

AKadekin,

Офигеть... а всё, что предложено выше (cmd, wsh, powershell) - бредятина, которая Вам не помогла? Зачетно...



Хотя, да... в моем скрипте была опечатка в наименовании переменной...

Вот исправленный вариант:



Код:

Код: Выделить всё

#requires -v 3.0
# путь к одному каталогу с файлами:
$fldin = 'z:\Путь_к_каталогу_с_файлами\Один_Каталог\*'
# путь к разным, целевым каталогам:
$fldout1 = 'z:\Путь_к_каталогу_с_файлами\AF1'
$fldout2 = 'z:\Путь_к_каталогу_с_файлами\AX1'
# если не существуют, то создаем:
if(!(test-path $fldout1)){md $fldout1|out-null}
if(!(test-path $fldout2)){md $fldout2|out-null}
# фильтр файлов по расширению:
$inc = '*.AF1','*.AX1'
# расширение для переименования:
$ext = '.MIX'
# кодировка:
$enc = 'utf8'
dir $fldin -inc $inc -file|%{
	$file = $_
	$tmp = (gc $_.fullname -raw -enc $enc) -replace ' \]',']'
	$tmp|sc $file.fullname -enc $enc
	if ($_.extension -eq '.AF1'){
		mi $_.fullname ("$fldout1\" + $_.basename + $ext)
	} elseif ($_.extension -eq '.AX1') {
		mi $_.fullname ("$fldout2\" + $_.basename + $ext)
	}
}

Но и Вы, при составлении условий не торопитесь, описывайте их полно и правильно, а то есть вот такое несоответствие:


Цитата AKadekin:



Файлы которые нужно обработать имеют расширения *.AX1 и *.MX1 и они находятся в одной папке.
CMD/BAT - Текстовые файлы




после чего показываете пример двух файлов, с таким наименованием:

1023000.AF1

1023000.AX1

что явно не соответствует *.AX1 и *.MX1
Аватара пользователя
AKadekin

Re: CMD/BAT - Текстовые файлы

Сообщение AKadekin »

AKadekin,
CMD/BAT - Текстовые файлы
Оно полностью отвечает поставленной Вами задаче.

Код сохраните в файл с расширением .vbs.


Цитата:



FileIn = Array("Z:\Box_In", "AX1", "Z:\Box_Out1", "MIX", _

"Z:\Box_In", "MX1", "Z:\Box_Out2", "MIX")



Здесь надо прописать свои пути и расширения файлов по предложенному образцу.

Одна строка соответствует одному сценарию обработки.



Здесь в первой строке в кавычках:

В папке "Z:\Box_In"

Надо обработать все файлы с расширением "AX1"

Поместить обработанные в папку "Z:\Box_Out1"

При этом изменить им расширение на "MIX"



В чём трудность прописать свои данные?



Во второй строке аналогично для второго расширения файлов

И таких строк может быть сколько угодно (Вы заказали 2 варианта)

Запускаете скрипт как любой исполнимый файл.



Кстати, это решение можно поместить в назначенные задания, чтобы скрипт исполнялся с некоторой периодичностью без Вашего дополнительного вмешательства:

Cscript "Путь\имяскрипта.vbs"



В чем у Вас непонимание? Вы хоть раз пытались запустить этот скрипт?. Или иной из предложенных Вам решений? Какой при этом результат получили? Чтобы Вам помочь, нужна адекватная обратная связь, а пустые стенания
Цитата:



Прошу помощи, для решения этой проблемы.



после предложенных вариантов не дает возможности это сделать.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»