删除文件中的 ~\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
我有以下文件,其中每个新行都是用字符 ~\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