Получить элемент в CSV-файле, сделать его целым числом и добавить его в начало строки

303
Yambotron

У меня есть 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 

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

0
Виноват. Убрал это. Yambotron 5 лет назад 0

2 ответа на вопрос

1
Worthwelle

Хотя вы отметили это как , на самом деле это выглядит как 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. Выведите строку, как вы хотели.
Ницца. Как * nix-хакер, пакетные скрипты действительно вызывают у меня зуд. glenn jackman 5 лет назад 1
1
HelpingHand

Если 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 

Похожие вопросы