добавление нового столбца в csv и заполнение значений альтернативами - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь написать командный файл в Windows, который копирует / добавляет новый столбец в начале файла CSV. а затем заполняет значения 0 и 1 поочередно

Например:

F1,F2,F3
1,2,3
1,2,3
2,3,4
3,4,5

Теперь я хочу сначала добавить новый столбец и добавить к ним значения бывший

F0,F1,F2,F3
0,1,2,3
1,1,2,3
0,2,3,4
1,3,4,5

Просто добавьте 0 для всех четных номеров строк и 1 для всех нечетных строк

Ниже приведен код, который я написал, но он просто добавляет 0 ко всем строкам, но я хочу, чтобы 0 и 1 попеременно

@echo off > newfile.csv & setLocal enableDELAYedeXpansion
for /f "tokens=* delims= " %%a in (J_CAFE27032018_090325.csv) do (
>> newfile.csv echo a,%%a
)

В эквиваленте c будет цикл for для всех четных и нечетных столбцов

for(i=0;i<n;i+2)
 {
   add 0
 }
for(i=0;i<n;i++)
 {
   add 0
 }

Не могли бы вы помочь мне с пакетным файлом, эквивалентным обходу всех нечетных и четных строк.

Ответы [ 4 ]

0 голосов
/ 26 апреля 2018

Этот метод такой же, как у Aacini, однако он добавляет строку заголовка к #,, (может быть изменено) .

@Echo Off & SetLocal EnableDelayedExpansion
Set "i=" & (For /F "UseBackQ Delims=" %%A In ("J_CAFE27032018_090325.csv") Do (
    If Defined i (Echo !i!,%%A) Else Set "i=1" & Echo #,%%A
    Set /A "i=(i+1)%%2"))>newfile.csv & Exit /B
0 голосов
/ 26 апреля 2018

Это один из нескольких способов сделать это:

@echo off & setLocal enableDELAYedeXpansion
set "i=0"
(for /f "delims=" %%a in (J_CAFE27032018_090325.csv) do (
   echo !i!,%%a
   set /A "i=(i+1)%%2"
)) > newfile.csv 

Однако ваша оригинальная логика неправильно обрабатывает заголовок (первую) строку ...

0 голосов
/ 26 апреля 2018
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q50041056.txt"
SET "outfile=%destdir%\outfile.txt"
SET "firstline=Y"
SET "zerostart=Y"
(
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
 IF DEFINED firstline (
  ECHO F0,%%a
  SET "firstline="
 ) ELSE (
  IF DEFINED zerostart (
   ECHO 0,%%a
   SET "zerostart="
  ) ELSE (
   ECHO 1,%%a
   SET "zerostart=Y"
  )
 )
)
)>"%outfile%"

GOTO :EOF

Вам необходимо изменить настройки sourcedir и destdir в соответствии с вашими обстоятельствами.

Я использовал файл с именем q50041056.txt, содержащий ваши данные для моего тестирования.

Создает файл, определенный как% outfile%

Параметр usebackq требуется только потому, что я решил добавить кавычки вокруг имени исходного файла.

В этом решении используется тот факт, что if defined интерпретирует текущий статус имени переменной, поэтому рассматриваемая переменная просто переключается между значением и ничем .

0 голосов
/ 26 апреля 2018

Я бы сделал это следующим образом - учитывая, что ни одна строка входного CSV-файла (data.csv) не превышает общую длину 1021 символа / байт:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_FILE=%~1" & rem // (CSV file to process; use first argument)
set "_SEP=,"    & rem // (separator character)
set "_HEAD=F0"  & rem // (header text for new column)
set /A "_MOD=2" & rem // (divisor for modulo operation)
set /A "_OFF=0" & rem // (offset for modulo operation)

setlocal EnableDelayedExpansion
rem // Determine number of lines contained in CSV file:
for /F %%C in ('^< "!_FILE!" find /C /V ""') do set /A "COUNT=%%C"
rem // Read from CSV file:
< "!_FILE!" (
    rem // Check whether header text is defined:
    if defined _HEAD (
        rem // Header text defined, so read current header:
        set "LINE=" & set /P LINE=""
        rem // Prepend header text for new column to current line:
        echo(!_HEAD!!_SEP!!LINE!
        rem // Decrement number of lines:
        set /A "COUNT-=1"
    )
    rem // Process remaining lines in a loop:
    for /L %%I in (1,1,!COUNT!) do (
        rem // Read current line:
        set "LINE=" & set /P LINE=""
        rem // Perform modulo operation:
        set /A "NUM=(%%I+_OFF-1)%%!_MOD!"
        rem // Prepend remainder of division to current line:
        echo(!NUM!!_SEP!!LINE!
    )
)
endlocal

endlocal
exit /B

Этот подход использует перенаправление ввода для чтения из входного файла CSV.

Чтобы записать вывод в другой файл CSV, скажем, data-mod.csv, а не в консоль, используйте следующую командную строку, предполагая, что сценарий называется prepend-modulo.bat, а входной файл CSV называется data.csv, и оба находиться в текущем каталоге:

prepend-modulo.bat "data.csv" > "data_mod.csv"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...