Слияние csv-файлов через пакет - PullRequest
0 голосов
/ 22 января 2020

Мне нужно объединить множество маленьких csv-файлов из разных источников в отдельные большие csv-файлы

Обычно я использую:

for /r E:\MyFolder %%d in (.) do ( 
    copy "%%d\*.csv" "%%d\merge.txt" /B
)

Это отлично работает, но для определенного типа файла CSV, где отсутствует новая строка в конце, где это не будет работать правильно. Я могу использовать:

for %%x in (E:\MyFolder\case1\*.csv) do more "%%x" >>E:\MyFolder\case1\merge.txt

Но он не будет работать рекурсивно, очевидно, только для верхней папки. Я попытался обернуть его для l oop так же, как в другом утверждении, но оно все равно не сработает.

Можете ли вы помочь мне заставить его работать рекурсивно?

1 Ответ

0 голосов
/ 22 января 2020

Следующий код должен работать для вас:

@echo off
rem // Define constants here:
set "_ROOT=E:\MyFolder"
set "_FILE=merge.csv"
set "_MASK=*.csv"
rem // Resolve target file path for later comparison:
for %%C in ("%_ROOT%\%_FILE%") do (
    rem // Write to target file:
    > "%%~fC" (
        rem // Change into parent directory of target file:
        pushd "%%~dpC." && (
            rem // Loop through all matching files:
            for /R %%F in ("%_MASK%") do (
                rem // Exclude target file:
                if /I not "%%~F"=="%%~fC" (
                    rem // Return file content with final line-break if needed:
                    more "%%~F"
                )
            )
            popd
        )
    )
)

Это работает, когда входные CSV-файлы содержат менее 64K строк / строк, каждая из которых короче 64K символов / байтов.

Для входных файлов CSV с 64K строк / строк или более замените more "%%~F" на < "%%~F" find /V "", учитывая, что каждая из строк / строк короче 4K символов / байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...