Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   CMD txt Задача (http://forum.oszone.net/showthread.php?t=343129)

patr1k 01-12-2019 01:42 2898658

CMD txt Задача
 
В папке много 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 2898662

Пробуйте:
Скрытый текст
Код:

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



Цитата:

Цитата patr1k
file1>>>data1;data2;data3;data4;data5;data6;data7; »

Зачем точка с запятой в конце?! Либо это тогда не:
Цитата:

Цитата patr1k
объединить все строки файла в одну с разделителем ";" »


megaloman 01-12-2019 08:46 2898669

patr1k,
Цитата:

Цитата 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 2898682

megaloman, замените:
Код:

For %%f In ("%FileIn%") Do (
на:
Код:

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

megaloman 01-12-2019 12:41 2898686

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

alpap 01-12-2019 16:12 2898707

Цитата:

Цитата megaloman
в переменную For получим имя файла без пути »

зайти в папку: pushd и все операции делать там, путь не нужен.

megaloman 01-12-2019 16:14 2898708

alpap, Чтобы зайти в папку, её надо знать.
Цитата:

Цитата megaloman
Либо надо как-то выдернуть путь из "%FileIn%", либо изначально вводить 2 переменные для папки и маски файлов. »


Iska 01-12-2019 17:09 2898714

megaloman, я обычно так и делаю по возможности.


Время: 23:27.

Время: 23:27.
© OSzone.net 2001-