1

第一次发帖并提前为自己是一个完整而彻底的新手道歉。我继承了一些我只是想破解解决方案的东西,我对它的了解为零。我已经搜索了论坛并相信已经找到了部分答案(sed 命令)但是,我在让它成功运行方面遇到了问题。

我需要让它在 Windows 机器上运行,它以前用于在 .csv 文件中进行简单替换,现在我需要插入标题行

我有一个“fixit.cmd”文件,其中包含这个;

set batdir=C:\Sed\filepath\batch
set impdir=C:\Sed\filepath\import
set filename=xxx

:: to read as parameter, uncomment next line
:: set filename=%1

cscript //NoLogo %batdir%\sed.vbs 1i"ABC,123" < %impdir%\%filename%.csv > %impdir%\%filename%_fixed.csv
pause

我有一个“sed.vbs”文件,其中包含这个;

Dim pat, patparts, rxp, inp
pat = WScript.Arguments(0)
patparts = Split(pat,"/")
Set rxp = new RegExp
rxp.Global = True
rxp.Multiline = False
rxp.Pattern = patparts(1)
Do While Not WScript.StdIn.AtEndOfStream
  inp = WScript.StdIn.ReadLine()
  WScript.Echo rxp.Replace(inp, patparts(2))
Loop

当我运行“fixit.cmd”时,我收到错误;

sed.vbs(7, 1) Microsoft VBScript runtime error: Subscript out of range: '[number: 1]'

我假设指向“sed.vbs”内容仅支持先前的替换和/或我的标题行插入字符串不正确。

我需要在“sed.vbs”内容和/或我的标题行插入字符串中进行哪些修改才能成功插入标题行

非常感谢任何/所有的支持。

4

2 回答 2

1

像这样更改批处理文件:

set "batdir=C:\Sed\filepath\batch"
set "impdir=C:\Sed\filepath\import"
set "filename=xxx"

REM to read as parameter, uncomment next line
REM set filename=%1

>%temp%\header.txt echo ABC,123
copy /b "%temp%\header.txt" + "%impdir%\%filename%.csv" "%impdir%\%filename%_fixed.csv"
pause

不再需要 VBS 文件。

关于我所做更改的一些说明:

  • 使用set命令的首选语法(防止杂散空格或一些特殊字符
  • 注释命令是REM. ::是一个格式错误的标签(在大多数情况下有效,但在某些情况下会咬你。
  • 路径引用(首选语法以避免文件夹名或文件名中的空格或某些特殊字符错误)

该行>%temp%\header.txt echo ABC,123创建一个带有标题行的文件。

copy命令连接两个文件(标题和您的文件),正如@luciole75w 已经在评论中写的那样。

于 2020-03-24T19:00:26.540 回答
0

vbs文件在这里没用,你可以把它扔掉。您的fixit.cmd文件可能如下所示:

@echo off

rem  environment variables set after setlocal will be discarded on exit instead
rem  of possibly altering the parent process (optional but good practice)
setlocal

set header_path="C:\Sed\filepath\batch\header.txt"

rem  ~ removes quotes if any, so that input_path is always quoted no matter if
rem  the argument is quoted or not (optional, easier to deal with spaces in paths)
set input_path="%~1"

rem  optional checking
if %input_path%=="" echo missing input file path & exit /b 1

rem  dpn = (d)rive + (p)ath + (n)ame, i.e. full path of input file without extension
set output_path="%~dpn1_fixed.csv"

rem  concatenate header + input to output
copy /b %header_path% + %input_path% %output_path% >nul

此批处理文件以输入 csv 路径作为参数调用(绝对或相对路径,包括扩展名)。现在,如果您更喜欢动态生成标题,那么您可以将最后一行 ( copy...) 替换为:

rem  column names including special characters (&, |, < or >) must be quoted
rem  the special character % must be doubled
set header="A|B=>C",50%%

rem  write the header to the output (overwrite the file if it already exists)
rem  parentheses are one way to avoid trailing spaces when redirecting
(echo %header%) > %output_path%

rem  concatenate input to output
type %input_path% >> %output_path%
于 2020-03-24T19:37:35.377 回答