删除文件中的 ~\r\n 个字符

Removing ~\r\n characters in a File

我有以下文件,其中每个新行都是用字符 ~\r\n<CR><LF>.

创建的

Sample test file

我想删除所有出现的 ~\r\n<CR><LF> 并替换为“”(空字符串),以便所有文件数据都显示在一行中。为此,我在 VBScript (replace.vbs) 中编写了一个脚本,并在命令行中使用 cscript replace.vbs "~\r\n<CR><LF>" "" 运行 - 第一个参数是我想要替换的原始字符,第二个参数是要写入文件的新文本。

我的脚本可以成功替换常规文本 - 例如,如果我只传递 <CR><LF> 作为要替换的字符串,它将按预期工作。但我的问题是当我通过完整的 ~\r\n<CR><LF> 时,它根本不会修改文件。我认为这与 ~\r\n 字符被错误地传递到命令中有关。

以下是我的脚本:

Const ForReading = 1
Const ForWriting = 2

strOldText = Wscript.Arguments(0)
strNewText = Wscript.Arguments(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "D:\FTP\Private\EDI\KleinschmidtTemp\"

Set objFolder = objFSO.GetFolder(objStartFolder)

Set colFiles = objFolder.Files
For Each objFile in colFiles
   if instr(objFile.Name,"BRO") <> 0 and instr(objFile.Name,".edi") <> 0 then
    Set objFileToRead = objFSO.OpenTextFile(objStartFolder + objFile.Name, ForReading)

    strText = objFileToRead.ReadAll
    objFileToRead.Close
    strNewText = Replace(strText, strOldText, strNewText)

    Set objFileToEdit = objFSO.OpenTextFile(objStartFolder + objFile.Name, ForWriting)
    objFileToEdit.WriteLine strNewText
    objFileToEdit.Close

    objFSO.MoveFile objStartFolder + objFile.Name, "D:\FTP\Private\EDI\Kleinschmidt\Outgoing\" + objFile.Name
   end if
Next

编辑:所以我发现对于我们的生产文件,<CR><LF> 将不是纯文本——它们实际上是不可打印的 ASCII 控制字符。所以我对我的脚本做了以下更改,我使用 Chr() 函数来获取这些字符并正确替换它们。

Const ForReading = 1
Const ForWriting = 2

'strOldText = Wscript.Arguments(0)
'strNewText = Wscript.Arguments(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "D:\FTP\Private\EDI\KleinschmidtTemp\"

Set objFolder = objFSO.GetFolder(objStartFolder)

Set colFiles = objFolder.Files
For Each objFile in colFiles
   if instr(objFile.Name,"BRO") <> 0 and instr(objFile.Name,".edi") <> 0 then
    Set objFileToRead = objFSO.OpenTextFile(objStartFolder + objFile.Name, ForReading)

    strText = objFileToRead.ReadAll
    objFileToRead.Close
    'strNewText = Replace(strText, strOldText, strNewText)
    strNewText = Replace(strText, Chr(10), "")      ' 10 is ASCII code for LF, line feed
    strNewText = Replace(strNewText, Chr(13), "")   ' 13 is ASCII code for CR, carriage return

    Set objFileToEdit = objFSO.OpenTextFile(objStartFolder + objFile.Name, ForWriting)
    objFileToEdit.WriteLine strNewText
    objFileToEdit.Close

    'objFSO.MoveFile objStartFolder + objFile.Name, "D:\FTP\Private\EDI\Kleinschmidt\Outgoing\" + objFile.Name
   end if
Next

不过我还有一个问题...当我打开生成的文件时,所有内容都在一行中,这正是我想要的。但是我的脚本没有删除文件末尾的 <CR><LF> ,所以多了一个空行。我该如何解决这个问题?

New resulting file

您可以在 Notepad++ 中执行此操作,方法是在“在替换中查找”对话框中打开 'Extended' 搜索模式。将 \r\n 替换为 \n.

您似乎也在 Window 的机器上执行此操作,如果您的系统上有 Cygwin 或 git bash,您也可以使用 sed,因为示例:

sed -i sed 's/\r$//' input

如果您不想就地编辑文件,并测试排除 -i 标志的结果。

我会尝试使用“~” & vbCrLF & “”作为搜索。 vbCrLf 是新行运输 return 组合的常量。

这在命令行或批处理文件中要容易得多。但由于您使用的是 VBScript,因此您需要执行以下操作。

首先,取消脚本参数。将控制字符传递给脚本参数将是正常工作的噩梦。相反,我们会将搜索硬编码到脚本中。如果您绝对需要使用参数来执行此操作,请发表评论,我会更新脚本来执行此操作,但它会变得更加混乱。

Const ForReading = 1
Const ForWriting = 2

' strOldText = Wscript.Arguments(0)
strOldText = "~" & vbCrLf & "<CR><LF>"
' strNewText = Wscript.Arguments(1)
strNewText = ""

Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "D:\FTP\Private\EDI\KleinschmidtTemp\"

Set objFolder = objFSO.GetFolder(objStartFolder)

Set colFiles = objFolder.Files
For Each objFile in colFiles
   if instr(objFile.Name,"BRO") <> 0 and instr(objFile.Name,".edi") <> 0 then
    Set objFileToRead = objFSO.OpenTextFile(objStartFolder + objFile.Name, ForReading)

    strText = objFileToRead.ReadAll
    objFileToRead.Close
    strNewText = Replace(strText, strOldText, strNewText)

    Set objFileToEdit = objFSO.OpenTextFile(objStartFolder + objFile.Name, ForWriting)
    objFileToEdit.WriteLine strNewText
    objFileToEdit.Close

    objFSO.MoveFile objStartFolder + objFile.Name, "D:\FTP\Private\EDI\Kleinschmidt\Outgoing\" + objFile.Name
   end if
Next

编辑

作为对编辑的回应,您在写回文件时将额外的行添加到文件中。您正在使用:

objFileToEdit.WriteLine

WriteLine 方法将换行符附加到字符串的末尾。只需使用 Write 即可。

objFileToEdit.Write strNewText