У меня есть CSV с сотнями записей, и я пытаюсь сделать следующее:

 1. Get the first element (decimal number, ex: 1.01)
 2. Remove the decimal part of the element (ex: 1)
 3. Add the new number to the beginning of the file

Пример ввода:

"1.01","China Town Grocery","OE"

Вот что мне нужно для вывода:

"1","1.01","China Town Grocery","OE"

Прямо сейчас я использую следующую команду for/do через командную строку:

for /f "tokens=*" %a in (input.txt) do (echo "input.txt[0]",%a) >> output.txt

Я знаю, что мне нужно изменить то, что я повторяю. Но я не знаю, как получить это значение. Что мне не хватает? Заранее спасибо.

2 ответа2

1

Хотя вы отметили это как , на самом деле это выглядит как Windows.

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

Вот пакетный файл, который я придумал:

@ECHO off
SETLOCAL EnableDelayedExpansion
for /f "tokens=*" %%a in (input.txt) do (
    CALL :GetNumber %%a
    echo "!num!",%%a
) >> output.txt

:GetNumber
for /f "tokens=1 delims=." %%a in (%1) do (
    set "num=%%a"
)

Поместите этот код в filename.bat и запустите его в том же каталоге, что и ваш файл input.txt .

Это делает несколько вещей:

  1. Включает отложенное расширение, чтобы разрешить обработку некоторых переменных внутри цикла FOR .
  2. Использует подпрограмму для обработки текущей строки
  3. Установите для переменной среды значение, которое вы ищете (потому что пакет не имеет функций с нативными операторами return )
  4. Выведите строку, как вы хотели.
1

Если PowerShell является вариантом:

Import-CSV "input.txt" -Header A,B,C | select-object New,A,B,C | ForEach-Object { $_.New = [math]::Floor($_.A); return $_ } | Export-CSV -Path output.txt -NoTypeInformation

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .