使用SED/VBS将标题行插入CSV

使用SED/VBS将标题行插入CSV,csv,batch-file,vbscript,header-row,Csv,Batch File,Vbscript,Header Row,第一篇帖子,并为自己是一个完全的新手提前道歉。我继承了一些东西,我只是在尝试破解一个解决方案,我对此一无所知。我已经搜索了论坛,相信已经找到了部分答案(sed命令),但是,我在让它成功运行时遇到了一个问题 我需要在Windows框上运行它,以前它用于.csv文件中的简单替换,现在我需要插入标题行 我有一个'fixit.cmd'文件,其中包含这个 set batdir=C:\Sed\filepath\batch set impdir=C:\Sed\filepath\import set filen

第一篇帖子,并为自己是一个完全的新手提前道歉。我继承了一些东西,我只是在尝试破解一个解决方案,我对此一无所知。我已经搜索了论坛,相信已经找到了部分答案(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
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”的内容只支持前面的replace和/或我的标题行插入字符串不正确

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


非常感谢您的支持。

更改批处理文件如下:

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
    命令使用首选语法(防止出现空格或某些特殊字符
  • comment命令是
    REM
    是一个格式不正确的标签(在大多数情况下有效,但在某些情况下会咬到你)
  • 引用路径(首选语法,以避免在文件夹名或文件名中出现空格或某些特殊字符错误)
%temp%\header.txt echo ABC,123
创建了一个带有标题行的文件


copy
命令将两个文件(头文件和您的文件)连接在一起,正如@luciole75w在注释中所写的那样。

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列名包括特殊字符(&、|、<或>)必须加引号
rem特殊字符%必须加倍
set header=“A | B=>C”,50%
rem将头写入输出(如果文件已经存在,则覆盖该文件)
rem括号是重定向时避免尾随空格的一种方法
(回显%header%)>%output\u path%
rem将输入连接到输出
键入%input\u path%>>%output\u path%

既然您使用的是Windows,那么您可以使用powershell吗?我最终不得不放弃使用powershell,只要powershell的配置能够通过任务计划轻松实现自动化和可执行性,那么,是的,我愿意进行探索。事实上,您发现的vb脚本在行上应用了正则表达式,它就不适合在这里使用。如果您的标题不适用于ot更改然后您可以简单地将其保存到一个单独的文件中,并使用
copy/b header.csv+input.csv input\u fixed.csv
将其与您的csv文件合并。作为旁注,如果您实际上没有访问sed的windows实现的权限,而仅访问vb存根,我不会使用标记“sed”来回答这个问题;)@luciole75w,感谢您的反馈和接受的编辑,谢谢。我也读过关于创建
head.txt
,然后创建
cat head.txt file.csv>newfile.csv
。Header确实是固定值。但是,我感谢您在这里问了很多问题,我也不知道如何做到这一点,并且需要手动完成所需的确切更改我有'fixit.cmd'和'sed.vbs'文件。你能提供任何指导吗?啊,Stephan的速度更快:)+1。请注意,他对
set
使用了另一种语法,这与我使用的语法不同。两种方法都是安全的,但使用方式不同。在引用整个赋值时,引号保护命令不受值中特殊字符的影响,然后它们将被丢弃,因此您必须在以后引用变量。当只引用
=
的右侧时,引号是变量的一部分,因此您不必到处引用它,这可能很方便,也可能不方便,具体取决于您之后的操作。您可以选择:)您可以将
“%~dpn1\u fixed.csv”
更改为
“%~dpn1\u fixed%~x1”
,使其更通用。你的引用很不寻常,我觉得很难阅读,但我想“个人偏好”取决于你的习惯。@Stephan我的引用对你来说可能不寻常,对我来说你的引用可能不寻常,但老实说,我几乎看不出这里有什么难读的。我甚至想说,对我来说,它使整个批处理文件更容易阅读,因为每次使用变量时,它不会被引号分散。在一种或另一种编码风格中没有客观的缺点,让我们尊重我们彼此已经习惯的:)干杯。经过测试,两者同样有效。非常感谢您的投入。谢谢大家!@luciole75w:我不喜欢浏览整个代码来决定一个变量是否正确引用,我更喜欢在需要的地方查看引号。但正如我所说,这是一个你习惯了什么的问题。正如你所说,这两种方法都有效,并且有各自的优缺点(只要你因此只使用其中一种)。我同意
rem
vs
。还有另外两条关于引用的评论,尽管这不是我个人的偏好;)@Stephan-我正在努力从impdir中读取变量文件名。我有以下内容,所有其他内容都保持不变,但在impdir中生成的输出只是“_fixed.csv”;set“batdir=C:\Sed\filepath\batch”set“impdir=C:\Sed\filepath\import”set“filename=%1”我缺少什么?可能
%1
是批处理文件的一个参数。您必须像使用
mybatch.bat文件名那样使用它,因此
%1
将被“翻译”为
FileName
。您的结果显示,
%1
为空,这意味着您没有给出参数。
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%