删除某些数据并添加新数据后,将批处理结果输出为CSV文本

时间:2013-01-31 19:22:01

标签: csv batch-file

我之前从未做过任何批处理脚本,所以我需要帮助来构建其中一个。 我们有一个文件说“GetHistory.bat”,它接受一个参数ID。脚本的输出如下所示:

Activity Name      Status      Date
----------------------------------------
Act1              Created    1-Jan-2013
Act2              Submitted  2-Jan-2013 
Act3              Approved   2-Jan-2013

现在问题是我需要将输出以txt格式导出为CSV而不将标题和参数ID添加到每行,如下所示:

1001,Act1,Created,1-Jan-2013
1001,Act2,Submitted,2-Jan-2013 
1001,Act3,Approved,2-Jan-2013

任何帮助开始编写脚本都将受到高度赞赏。 谢谢...!

1 个答案:

答案 0 :(得分:1)

假设GetHistory.bat的输出已被重定向到名为history.txt的文件中,我们可以将其输入到我们的新批处理文件ParamCSV.bat中,就像这样, :

C:\stackoverflow>ParamCSV.bat 1001 < history.txt
1001,Act1,Created,1-Jan-2013
1001,Act2,Submitted,2-Jan-2013
1001,Act3,Approved,2-Jan-2013

为了整理一个快速脚本,我引用了以下信息:

我想出了这个批处理脚本ParamCSV.bat

@echo off
:: ParamCSV.bat
::
:: Usage: ParamCSV.bat <Parameter_ID> < history.txt
::
:: Thanks to:
:: https://stackoverflow.com/questions/6979747/read-stdin-stream-in-a-batch-file/6980605#6980605
:: https://stackoverflow.com/questions/636381/what-is-the-best-way-to-do-a-substring-in-a-batch-file
:: https://stackoverflow.com/questions/3001999/how-to-remove-trailing-and-leading-whitespace-for-user-provided-input-in-a-batch

:: Copy input parameter to 'id'
set id=%1

setlocal DisableDelayedExpansion

for /F "skip=2 tokens=*" %%a in ('findstr /n $') do (
  set "line=%%a"
  setlocal EnableDelayedExpansion
  set "line=!line:*:=!"
  set "activity=!line:~0,17!"
  call:trim !activity! activity
  set "status=!line:~17,11!"
  call:trim !status! status
  set "date=!line:~28,11!"
  call:trim !date! date
  echo(!id!,!activity!,!status!,!date!
  endlocal
)
goto:EOF

::function: trim
::synopsis: Removes leading and trailing whitespace from a sting. Two
::          parameters are expected. The first is the text string that
::          is to be trimmed. The second is the name of a variable in
::          the caller's space that will receive the result of the
::          trim operation.
::
::usage:    call:trim string_to_trim var_to_update
::             e.g.   call:trim %myvar1% myvar2

::trim left whitespace
setlocal
set input=%~1
for /f "tokens=* delims= " %%a in ("%input%") do set input=%%a
::trim right whitespace (up to 100 spaces at the end)
for /l %%a in (1,1,100) do if "!input:~-1!"==" " set input=!input:~0,-1! 
::return trimmed string in place
endlocal&set "%~2=%input%"

此处有许多假设,如果其中任何一个更改或无效,脚本将会中断:

  • GetHistory.bat的输出具有宽度为17,11和11的固定宽度列。您没有提供两位数日的示例,因此我假设日期是正确的 - 对齐。
  • 有两个标题行,我们在for语句中跳过。
  • 所有输出行都是相同的ID,因此只需要一个输入参数,它是所有CSV输出行中的第一个元素。