Windows-batchkode for at fusionere fil og redigere

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har meget csv-fil i en mappe.
Filerne hedder OPERATORS\_*.csv hvor * er en variabel.


Jeg vil bruge en batchfil til at fusionere alle filer i en, slette den første række i hver fil og tilføj i * i slutningen af ​​hver række.


Jeg har prøvet denne kode:


copy /b OPERATORS\_*.csv OPERATORS\_FULL.csv


Denne måde er fint, men den første række i hver fil udskrives, og jeg tabte attributten i filnavnet.


Eksempel:


OPERATORS\_ACTIVITY1.csv


OPT;SALES;REDEMPTION
OPT1;12;75


OPERATORS\_ACTIVITY2.csv


OPT;SALES;REDEMPTION
OPT2;22;64


og jeg vil have det her:


OPERATORS\_FULL.csv


OPT1;12;75;ACTIVITY1
OPT2;22;64;ACTIVITY2


Nogen forslag?

Bedste reference


Prøv dette (Opdater # 2) :


@ECHO OFF
SETLOCAL EnableDelayedExpansion

IF EXIST OPERATORS\_FULL.csv DEL OPERATORS\_FULL.csv
IF EXIST OPERATORS\_FULL.tmp DEL OPERATORS\_FULL.tmp

FOR \%\%A IN ( OPERATORS\_*.csv ) DO (
    :: get attribute from filename
    SET "attr=\%\%A"
    SET "attr=!attr:OPERATORS\_=!"
    SET "attr=!attr:.csv=!"
    :: get date suffix
    SET tmp=!attr:\_= !
    FOR \%\%G IN ( !tmp! ) DO (
        SET date\_=\%\%G
    )
    :: if we have a date (i.e. a numeric value)
    IF !date\_! EQU +!date\_! (
        :: ...remove date from attr with leading underscore
        CALL SET attr=\%\%attr:\_!date\_!=\%\%
    ) ELSE (
        :: ...else clear date variable
        SET date\_=
    )
    :: dump CSVs, skipping each header line, adding the attribute from the filename
    FOR /F "skip=1 tokens=*" \%\%G IN ( \%\%A ) DO ECHO \%\%G;!attr!;!date\_! >> OPERATORS\_FULL.tmp
)

REN OPERATORS\_FULL.tmp OPERATORS\_FULL.csv

Andre referencer 1




Her er en anden tilgang ved omdirigering - se alle de forklarende rem bemærkninger i scriptet:


@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "\_INPUT=OPERATORS\_*.csv"     & rem // (input files)
set "\_OUTPUT=OPERATORS\_FULL.csv" & rem // (output file)
set /A "\_SKIP=1" & rem // (number of lines to skip for each input file)

rem // Redirect the whole output at once:
> "\%\_OUTPUT\%" (
    rem // Iterate over all the input files:
    for \%\%F in ("\%\_INPUT\%") do (
        rem // Store the current file name to get the attribute name later:
        set "NAME=\%\%~nF"
        rem // Exclude the output file from being processed:
        if /I not "\%\%~nxF"=="\%\_OUTPUT\%" (
            rem // Determine the number of lines of the current input file:
            for /F \%\%E in ('^< "\%\%~F" find /C /V ""') do set /A "CNT=\%\%E"
            rem // Read current input file:
            < "\%\%~F" (
                setlocal EnableDelayedExpansion
                rem // Loop over every line:
                for /L \%\%E in (1,1,!CNT!) do (
                    rem // Read current line:
                    set "LINE=" & set /P LINE=""
                    rem // Return current line if it is not to be skipped:
                    if \%\%E GTR \%\_SKIP\% echo(!LINE!;!NAME:*\_=!
                )
                endlocal
            )
        )
    )
)

endlocal
exit /B

Andre referencer 2


@echo off
setlocal
del operators\_full.csv 2>nul >nul 
FOR \%\%f IN (operators\_*.csv) DO for /f "usebackqdelims=" \%\%a in ("\%\%f") do echo \%\%a>operators\_full.txt&goto body
:body
(
FOR \%\%f IN (operators\_*.csv) DO FOR /f "tokens=1*delims=\_" \%\%s IN ("\%\%~nf") DO for /f "skip=1usebackqdelims=" \%\%a in ("\%\%f") do echo \%\%a;\%\%t
)>>operators\_full.txt

move operators\_full.txt operators\_full.csv


Først skal du slette outputfilen, hvis den eksisterer, og start derefter kopiering af filen/filerne til en .txt fil, men bevidst abort efter den allerførste linje.


derefter for hver fil, der tilkenes på \_ i navnedelen af ​​filen \%\%f, kopieres hver linje, tilføjer posten \_ delen af ​​filnavnet i \%\%t, skip ping den første og tilføj til filen .txt (bemærk positionen af ​​det ydre par parentes - denne syntaks gør det muligt at omdirigere udgangen af ​​hele kodeblokken)


Endelig skal du flytte eller omdøbe filen.


Åh - du vil ikke have overskriften linje? Slip den første for linje.