Ryan Hutcheson
Ryan Hutcheson

Reputation: 1

How do I combine files in order

I have/found a windows batch script that will combine csv files from all sub-directories. It works great in Windows 10 but when I run the script in Windows 7, all the files are out of order. How do I force the order in which to combine the csv files?

echo @off
for /r %%i in (*.csv) do (
if not %%~nxi == output.csv (
echo %%~nxi >> output.csv
echo %%i
echo %%~nxi
type "%%i" >> output.csv
echo. >> output.csv
echo. >> output.csv
)
)

Upvotes: 0

Views: 1268

Answers (4)

Ryan Hutcheson
Ryan Hutcheson

Reputation: 1

Thanks to all of you for your help. After reading all the responses, I realized that I could get around the windows sorting problem by sorting into a second file and then reading it from there.

dir /b /s /O:N *.csv | sort > file.txt
for /f %%A IN (file.txt) do (
if not %%~nxA == output.csv (
echo %%~dpnxA
echo %%~nxA >> output.csv
type %%A >> output.csv
echo. >> output.csv
echo. >> output.csv
)
)

Again, thank you for all your help.

Upvotes: 0

Squashman
Squashman

Reputation: 14290

This is just a slight modification to POW's answer that should give you better performance. This technique keeps the file open for writing. When you use the append multiple times, it is opening and closing the output file. So the file pointer has to be reset every time it outputs to the file.

@echo off
(FOR /F "usebackq delims=" %%i IN (`dir /s /b /O:N *.csv`) do (
    echo %%~nxi
    echo %%i >con
    type "%%i"
    echo.
    echo.
)
)>output.tmp
rename output.tmp output.csv

Upvotes: 1

double-beep
double-beep

Reputation: 5504

Here is another possible solution:

@echo off

for /R %%A IN (*.csv) do (
     if not "%%~nxA"=="output.csv" (
           (echo %%~fA && type "%%~fA" && echo. && echo.)>>output.csv
           echo Processed: %%A
           echo %%~nxA
     )
)

with much less code.

  • Using /R option with for to loop through subfolders in %cd%.
  • We want to parse ALL csv files so, we specify it in parenthesis with (*.csv).
    • Then, we check if csv file currently processed is output.csv.
      • If not, then we append full path of the csv ("%%~fA") file, its content (type "...") and two newlines (echo.) to output.csv. This condition is not really required, but added to be on-topic with the question. Also, if you don't want to append full path to output.csv, but filename and extension only just replace %%~fA with %%~nxA.
      • After that, we echo current file processed and its filename and extension.

      • If file currently processed is output.csv, then we repeat the loop.
  • Now, output.csv has the contents of all csv files in all subdirectories.

So, now open a new cmd and type the following commands. Read the output carefully:

  • for /?
  • if /?
  • echo /?
  • type /?

Some suggestions for further reading:

Upvotes: 0

Tyl
Tyl

Reputation: 5252

Just a little change to your code will do the job:

@echo off
FOR /F "usebackq delims=" %%i IN (`dir /s /b /O:N *.csv`) do (
    if not "%%~nxi" == "output.csv" (
        echo %%~nxi >> output.csv
        echo %%i
        echo %%~nxi
        type "%%i" >> output.csv
        echo. >> output.csv
        echo. >> output.csv
    )
)

Point is to use another command's out -- use dir to control the sorting order.
/b for clean output by dir
/O for ordering, N -- name.
check FOR /? and dir /? for more details.

PS: you may wanna use:

echo %%~dpnxi >> output.csv

instead of line 4's echo %%~nxi >> output.csv , to show full path of each file in your output.csv.

Upvotes: 2

Related Questions