Показать полную графическую версию : Текстовые файлы
AKadekin
09-08-2019, 12:12
Доброе время!
Прошу помощи, для создания батника нужно в текстовый файл нужно удалить знак пробел перед знаком "]" это знак не везде встречается в текстовом файле.
обрабатывать нужно 1 текстовой файл?
AKadekin
09-08-2019, 13:32
Да, обрабатывается 1 файл. Имя этих файлов разное но расширение одно.
0. открываем файл обычным блокнотом
1. нажимаем Ctrl + H
2. В верхнем поле пишем " ]" (без кавычек, разумеется)
3. в нижнем - "]" (опять же без кавычек)
4. нажимаем "Replace all" (или "Заменить все" - кто под каким языком сидит)
5. сохраняем, закрываем
и ненадо придумывать батники.
megaloman
09-08-2019, 15:53
AKadekin, Я Вас умоляю, не связывайтесь с CMD для обработки текстовых файлов. Вот vbs. Взято с мизерными изменениями здесь. (http://forum.oszone.net/thread-340489.html)FileIn = "Z:\Box_In\playlist.txt"
RegExp = " *]"
Rep="]"
With WScript.Arguments
If .Count <> 0 Then FileIn = .Item(0)
End With
With CreateObject("Scripting.FileSystemObject")
On Error Resume Next
With .OpenTextFile(FileIn, 1)
If Err.Number <> 0 Then
MsgBox "Error open file " + vbCrLf + vbCrLf + FileIn + vbCrLf + vbCrLf + "Err.Number " + CStr(Err.Number) + vbCrLf + Err.Description
WScript.Quit 1
End If
InTxt = .ReadAll
If Err.Number <> 0 Then
MsgBox "Error read file " + vbCrLf + vbCrLf + FileIn + vbCrLf + vbCrLf + "Err.Number " + CStr(Err.Number) + vbCrLf + Err.Description
WScript.Quit 1
End If
.Close
On Error GoTo 0
End With
With CreateObject("VBScript.RegExp")
.Pattern = RegExp
.IgnoreCase = True
.Global = True
If Not .Test(InTxt) Then
MsgBox "no substrings to replace. Reg expression:" + vbCrLf + vbCrLf + """" + RegExp + """"
WScript.Quit 1
End If
Result = .Replace(InTxt, Rep)
End With
With .CreateTextFile(FileIn, True)
.Write Result
.Close
End With
End With
MsgBox "Done!"
AKadekin
09-08-2019, 16:45
так вот он нужен .. так как в день нужно быстро передать и таких файлов может быть много больше 30
Вероятность, что будет ошибка есть.
так вот он нужен .. так как в день нужно быстро передать и таких файлов может быть много больше 30
Вероятность, что будет ошибка есть.
обрабатывается 1 файл »
таких файлов может быть много больше 30 »
вопрос от Ageron задавался не просто так.
Кроме этого хорошо бы знать расположение этих файлов (все в одной папке или в разных, меняется ли расположение этой папки/папок), по какому принципу должны отбираться файлы (нет ли среди тех которые нужно обработать те которые обрабатывать ненужно/нельзя), могут ли быть варианты в которых пробелов перед ] будет больше одного и как поступать в таких случаях. Возможно еще какие-то варианты нужно предусмотреть (кодировку, например), ну и (не факт, но возможно) кто-то затребует пример исходного файла.
megaloman
09-08-2019, 21:33
FileIn1 = "Z:\Box_In\playlist.txt"
RegExp = " *]"
Rep = "]"
ReDim FileIn(0)
MM = 0
FileIn(0) = FileIn1
With WScript.Arguments
If .Count <> 0 Then
MM = .Count - 1
ReDim FileIn(MM)
For m = 0 To MM
FileIn(m) = .Item(m)
Next
End If
End With
Msg = ""
Set FSO = CreateObject("Scripting.FileSystemObject")
For m = 0 To MM
If Contr1(FSO, FileIn(m), InTxt, Msg) Then
If Contr2(FileIn(m), RegExp, InTxt, Rep, Msg) Then
With FSO.CreateTextFile(FileIn(m), True)
.Write InTxt
.Close
Msg = Msg + FileIn(m) + " ==Done" + vbCrLf
End With
End If
End If
Next
MsgBox Msg
Function Contr1(FSO, fName, txt, MS)
Contr1 = 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
Contr1 = True
End Function
Function Contr2(fName, RExp, txt, RR, MS)
Contr2 = False
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
Contr2 = True
End Function
AKadekin
10-08-2019, 09:20
Файлы находятся в одной папке потом они перемещаются в разные папки.
Файлы которые нужно обработать имеют расширения *.AX1 и *.MX1 и они находятся в одной папке.
После обработки перед перемещением их нужно переименовать в *.MIX (бывший *.AX1 - ложится в одну папку, другой в другую)
Эти файлы содержат разные данные но "структура" одинаковая. В этих файлах нужно перед знаком ] убрать пробел. Там всегда один пробел лишний.
Расположение папок фиксировано не меняется.
Все что нужно.
Файлы находятся в одной папке потом они перемещаются в разные папки.
Файлы которые нужно обработать имеют расширения *.AX1 и *.MX1 и они находятся в одной папке.
После обработки перед перемещением их нужно переименовать в *.MIX (бывший *.AX1 - ложится в одну папку, другой в другую)
Эти файлы содержат разные данные но "структура" одинаковая. В этих файлах нужно перед знаком ] убрать пробел. Там всегда один пробел лишний.
Расположение папок фиксировано не меняется.
Все что нужно.
Файлы находятся в одной папке »
В какой?
потом они перемещаются в разные папки. »
В какие?
Файлы которые нужно обработать имеют расширения *.AX1 и *.MX1 и они находятся в одной папке. »
Какие? Сколько их? Откуда они там возникают? В чём разница между *.AX1 и *.MX1, и есть ли связь между *.AX1 и *.MX1?
После обработки перед перемещением их нужно переименовать в *.MIX »
А если окажутся одноимённые файлы?
(бывший *.AX1 - ложится в одну папку »
В какую?
другой в другую) »
В какую?
Эти файлы содержат разные данные но "структура" одинаковая. В этих файлах нужно перед знаком ] убрать пробел. Там всегда один пробел лишний. »
Упакуйте по три-четыре типичных разных файла *.AX1 и *.MX1 в архив и приложите к сообщению.
Расположение папок фиксировано не меняется. »
На всякий случай, ещё раз — какое именно?
P.S. Уберите задвоение текста в Вашем последнем и предпоследнем сообщениях.
Да, обрабатывается 1 файл. Имя этих файлов разное но расширение одно. »
[когнитивный диссонанс ON]
Он либо один, либо этих файлов больше чем один. Это взаимоисключающие условия.
[когнитивный диссонанс OFF]
Файлы находятся в одной папке потом они перемещаются в разные папки.
Файлы которые нужно обработать имеют расширения *.AX1 и *.MX1 и они находятся в одной папке.
После обработки перед перемещением их нужно переименовать в *.MIX (бывший *.AX1 - ложится в одну папку, другой в другую)
Эти файлы содержат разные данные но "структура" одинаковая. В этих файлах нужно перед знаком ] убрать пробел. Там всегда один пробел лишний.
Расположение папок фиксировано не меняется.
Все что нужно. »
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)
}
}
AKadekin
10-08-2019, 13:54
Это пример одного файлов они по структуре похоже, отличаются только внутренними данными.
[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
10-08-2019, 17:53
AKadekin, 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
12-08-2019, 10:15
В архиве находятся файлы158559
AKadekin,
если просто пробел мозолит глаза, не проще убрать [] везде по тексту, потому как пробелы в конце строк встречаются и в строках не имеющих этих скобок.
(да, и нужны ли 17 пробелов между абзацами?), т.е. как в дальнейшем будет использоваться этот файл?
megaloman
12-08-2019, 16:03
@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
14-08-2019, 17:29
Главное что бы до ] пробел убрать.
Структура должна быть сохранена и столько пробелов нужно.
AKadekin
15-08-2019, 08:05
Прошу помощи, для решения этой проблемы.
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)
}
}
Но и Вы, при составлении условий не торопитесь, описывайте их полно и правильно, а то есть вот такое несоответствие:
Файлы которые нужно обработать имеют расширения *.AX1 и *.MX1 и они находятся в одной папке. »
после чего показываете пример двух файлов, с таким наименованием:
1023000.AF1
1023000.AX1
что явно не соответствует *.AX1 и *.MX1
megaloman
15-08-2019, 11:02
AKadekin, что конкретно не устроило в этом моём решении? (http://forum.oszone.net/post-2883477-13.html) Оно полностью отвечает поставленной Вами задаче.
Код сохраните в файл с расширением .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"
В чем у Вас непонимание? Вы хоть раз пытались запустить этот скрипт?. Или иной из предложенных Вам решений? Какой при этом результат получили? Чтобы Вам помочь, нужна адекватная обратная связь, а пустые стенанияПрошу помощи, для решения этой проблемы.после предложенных вариантов не дает возможности это сделать.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.