@echo off
setlocal
rem Help message.
if "%~1" == "/?" goto :help
rem Set delimiter for joining lines.
if "%~3" == "" (set "delim=,") else set "delim=%~3"
rem Count the lines of the 1st file.
set "count=-1"
for /f "usebackq" %%A in ("%~1") do set /a "count+=1"
rem Merge the files.
for /l %%A in (0 1 %count%) do call :merge %%A %*
exit /b
:merge
if %~1 equ 0 (set "skip=") else set "skip=skip=%~1"
(
for /f "usebackq %skip% delims=" %%A in ("%~2") do (
set /p "=%%A" < nul
) & (
for /f "usebackq %skip% delims=" %%B in ("%~3") do (
set /p "=%delim%%%B" < nul
) & echo(& exit /b
)
)
exit /b
:help
echo Merge lines of 2 text files.
echo(
echo Syntax: %~n0 file1 file2 [delimiter]
echo(
echo Examples:
echo %~n0 a1.csv a2.csv
echo Delimiter is comma (default).
echo %~n0 a1.csv a2.csv ";"
echo Delimiter is semi-colon.
echo %~n0 a1.csv a2.csv ^> a3.csv
echo Delimiter is comma (default).
echo Redirect stdout to file a3.csv.
exit /b
Это может нормально работать с 2 строками файла csv, хотя может быть ужасно для
100 или 1000 строк, когда он открывается, читает строку и затем закрывает файл.
Параметр skip
означает, что при открытии файла может потребоваться подсчитать
на число skip
, которое будет замедлять чтение при каждой строке чтения
число увеличивается.
Из-за ограничений CMD переменная может хранить до 4096
символов
поэтому допускается в среднем до 40
символов на ячейку между
разделители, основанные на 100
ячеек на строку.
Если вы слишком близко к 4096
. тогда линия может обрезаться как
Сквошман, упомянутый в комментарии.
Он не поддерживает многострочные ячейки CSV или
что-нибудь еще экзотическое в спецификации CSV.
Это слияние тупой линии с использованием разделителя для присоединения.
В нем есть справочное сообщение, т.е.
scriptname /?
Или используйте его для объединения 2 CSV-файлов:
scriptname file1.csv file2.csv
Чтобы сохранить в выходной файл, используйте:
scriptname file1.csv file2.csv > file3.csv
Чтобы установить разделитель, отличный от ,
, используйте третий аргумент.
scriptname /?
показывает пример.