如何从Windows中的分隔文件中的每条记录中删除第一个和最后一个字符?

时间:2016-02-29 06:04:15

标签: regex string windows batch-file

我有一个从Sybase IQ数据库导出的分隔数据文件。它在数据文件中每条记录的开头和结尾都有引号。数据本身是制表符分隔的,例如

    'Name <tab> Address <tab> Phone'
    'Name <tab> Address <tab> Phone'
    'Name <tab> Address <tab> Phone'

我想删除第一个和最后一个字符,即单引号。我不关心嵌入在数据文件中任何记录中的单引号。

我根据本网站上的答案尝试了类似的内容:

    @echo off
    Set "InputFile=oldfile.dat"
    Set "OutputFile=newfile.dat"

    setLocal EnableDelayedExpansion > "%OutputFile%"

    for /f "usebackq tokens=* delims=" %%a in ("%InputFile%")
    do (
        set variable=%%a
        set variable=%variable:~0,+1!
        set variable=%variable:~0,-1!
        echo.%variable
    >> "%OutputFile%" 
    )

但我得到的命令语法不正确&#39;错误信息。

3 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
Set "InputFile=oldfile.dat"
Set "OutputFile=newfile.dat"

> "%OutputFile%" (
    for /f "usebackq tokens=* delims=" %%a in ("%InputFile%") do (
        set "variable=%%~a"
        set "variable=!variable:~1!"            remove the 1st character
        set "variable=!variable:~0,-1!"         remove the last character
        echo.!variable!
    )
)

资源(必读):

答案 1 :(得分:0)

与大多数其他文本文件修改任务一样,使用JREPL.BAT - a regular expression find and replace utility可以轻松有效地解决此问题。 JREPL是纯脚本(混合JScript /批处理),可以在XP以后的任何Windows机器上本机运行。可以从命令行通过jrepl /?jrepl /??获取完整文档以获取分页输出。

jrepl "^'(.*)'$" "$1" /f "oldfile.txt" /o "newfile.txt"

您可以通过将-指定为输出文件来使输出覆盖原始文件。

jrepl "^'(.*)'$" "$1" /f "file.txt" /o -

JREPL是一个批处理文件,因此如果将命令放在另一个批处理脚本中,则必须使用CALL JREPL。

答案 2 :(得分:0)

批处理文件无法准确处理某些数据,因此解决此问题的最佳方法是使用混合Batch-JScript文件,如dbenham的JREPL.BAT。

但是,您不需要数百行代码来执行替换,就像这一行一样简单。下面的小型Batch-JScript混合文件实现了这种替换,并且非常简单,因此您可以理解它并引入一些小修改,即使您对JScript一无所知。使用.BAT扩展名保存此文件。

@if (@CodeSection == @Batch) @then

@echo off
setLocal
Set "InputFile=oldfile.dat"
Set "OutputFile=newfile.dat"

cscript //nologo //E:JScript "%~F0" < "%InputFile%" > "%OutputFile%"

goto :EOF


@end


// JScript section

while ( ! WScript.Stdin.AtEndOfStream ) {
   WScript.Stdout.WriteLine(WScript.Stdin.ReadLine().slice(1,-1));
}