Как объединить файлы CSV, используя пакетный файл, который добавляет к существующим строкам и столбцам? - PullRequest
0 голосов
/ 04 января 2019

Мне нужно объединить файлы рядом, а не один под другим. Я видел другие примеры и пробовал их, но, похоже, это не работает.

Файл имеет две строки и 100 столбцов. Оба файла имеют следующий вид:

copy "File1.csv" "File2.csv"

Если я открываю объединенный файл в Excel, я вижу первую строку второго файла в третьей строке объединенного файла. мне нужно, чтобы первая строка обоих файлов была объединена последовательно, а не одна под другой.

Ответы [ 2 ]

0 голосов
/ 06 января 2019
@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 /? показывает пример.

0 голосов
/ 05 января 2019

Вам может понадобиться:

@echo off
setlocal EnableDelayedExpansion

rem Define variables for count of lines:
set /a F1=0
set /a F2=0

for /F "delims=" %%A IN (file1.csv) do (
    set /a F1+=1
    set F1[!F1!]=%%A
)

for /F "delims=" %%B IN (file2.csv) do (
    set /a F2+=1
    set F2[!F2!]=%%B
)

rem If the don't have, which is quite common, you can try:
if %F1% NEQ %F2% (
    if %F1% GTR %F2% (
        for /L %%C IN (1 1 %F1%) do (
            if %%C LSS %F2% (
                (echo/!F1[%%C]!,!F2[%%C]!)>>new.csv
            ) else (
                (echo/!F1[%%C]!)>>new.csv
            )
        )
    ) else (
        for /L %%C IN (1 1 %F2%) do (
            if %%C LSS %F1% (
                (echo/!F1[%%C]!,!F2[%%C]!)>>new.csv
            ) else (
                (echo/!F2[%%C]!)>>new.csv
            )
        )
    )
) else (
    for /L %%C IN (1 1 %F1%) do (
        (echo/!F1[%%C]!,!F2[%%C]!)>>new.csv
    )
)
...