Войти

Показать полную графическую версию : CMD txt Задача


patr1k
01-12-2019, 01:42
В папке много txt с разными названиями (пример):
file1.txt
file2.txt
file3.txt
file4.txt
...

В каждом txt различные данные (пример):
data1 data2
data3
data4 data5 data6 data7
...

Необходимо в начало каждого файла добавить название самого файла (без расширения), дописать после этого ">>>" и объединить все строки файла в одну с разделителем ";"

file1>>>data1;data2;data3;data4;data5;data6;data7;

Далее объединить полученные результаты из всех файлов в один txt построчно.

file1>>>data1;data2;data3;data4;data5;data6;data7;
file2>>>data1;data2;data3;data4;data5;data6;data7;
file3>>>data1;data2;data3;data4;data5;data6;data7;
file4>>>data1;data2;data3;data4;data5;data6;data7;
...

Iska
01-12-2019, 02:27
Пробуйте:
Option Explicit

Dim strSourceFolder

Dim objFSO
Dim objFile

Dim objDictionary


If WScript.Arguments.Count = 1 Then
strSourceFolder = WScript.Arguments.Item(0)

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FolderExists(strSourceFolder) Then
Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

For Each objFile In objFSO.GetFolder(strSourceFolder).Files
If StrComp(objFSO.GetExtensionName(objFile.Name), "txt", vbTextCompare) = 0 Then
With objFSO.OpenTextFile(objFile.Path)
objDictionary.Add objFile.Name, objFSO.GetBaseName(objFile.Name) & ">>>" & Join(Split(.ReadAll(), vbCrLf), ";")
.Close
End With
Else
' Nothing to do
End If
Next

With objFSO.CreateTextFile("Result.txt", True)
.Write Join(objDictionary.Items, vbCrLf)
.Close
End With

Set objDictionary = Nothing
Else
WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
WScript.Quit 2
End If

Set objFSO = Nothing
Else
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
WScript.Quit 1
End If

WScript.Quit 0


file1>>>data1;data2;data3;data4;data5;data6;data7; »
Зачем точка с запятой в конце?! Либо это тогда не:
объединить все строки файла в одну с разделителем ";" »

megaloman
01-12-2019, 08:46
patr1k, В каждом txt различные данные (пример): » Хотелось бы знать, какие символы содержат данные, а лучше всё-таки увидеть живьём хотя бы один txt-файл.
А так, пальцем в небо, вариант bat-файла@Echo Off
Set "FileIn=Z:\Box_In\*.txt"
Set "FileOut=Z:\Box_Out\out file.txt"

2>nul Del "%FileOut%"
For %%f In ("%FileIn%") Do (
Set "String="
FOR /F "usebackq delims=" %%s IN ("%%f") DO (
For %%d In (%%s) Do (
Call Set "String=%%String%%%%d;"
)
)
>>"%FileOut%" Call :Out "%%f" "%%String%%"
)
Exit /B 0

:Out
(Echo %~n1^>^>^>%~2)
rem >%1 (Echo %~n1^>^>^>%~2)
Exit /B Исходные и выходной файлы должны быть в разных папках, либо выходной файл должен иметь иное расширение.
Я не стал изменять исходные файлы, однако, если это необходимо сделать, уберите rem в выделенной строке.
Пути к файлам пропишИте свои.

Iska
01-12-2019, 12:15
megaloman, замените:
For %%f In ("%FileIn%") Do (
на:
for /f (`dir /b /a:-d "%FileIn%"…
дабы был не перебор текущих файлов, а разбор зараз сделанной выборки файлов — и будет можно делать вывод в .txt. Хотя, конечно, сам посыл абсолютно верен.

megaloman
01-12-2019, 12:41
Iska, Не совсем понял Ваш совет. Что мне не нравится в Dir в этом контексте - в переменную For получим имя файла без пути. А в последующем мне нужно полное имя файла. Либо надо как-то выдернуть путь из "%FileIn%", либо изначально вводить 2 переменные для папки и маски файлов.
Слабое место скрипта - я не знаю, что такое dataXX, если там какие-нибудь звёздочки со знаками препинания и спецсимволами - тады ой! А Вы, почему-то вопреки устоявшейся правильной традиции, не затребовали образец файла и я не смог воспользоваться результатом Ваших усилий :)

alpap
01-12-2019, 16:12
в переменную For получим имя файла без пути »
зайти в папку: pushd и все операции делать там, путь не нужен.

megaloman
01-12-2019, 16:14
alpap, Чтобы зайти в папку, её надо знать.Либо надо как-то выдернуть путь из "%FileIn%", либо изначально вводить 2 переменные для папки и маски файлов. »

Iska
01-12-2019, 17:09
megaloman, я обычно так и делаю по возможности.




© OSzone.net 2001-2012