【问题标题】:Removing ~\r\n characters in a File [duplicate]删除文件中的 ~\r\n 个字符 [重复]
【发布时间】:2021-07-20 23:55:59
【问题描述】:

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

编辑:所以我发现对于我们的生产文件,&lt;CR&gt;&lt;LF&gt; 不会是纯文本 - 它们实际上是不可打印的 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

我仍然有一个问题...当我打开生成的文件时,所有内容都在一行中,这正是我想要的。但是我的脚本没有删除文件末尾的&lt;CR&gt;&lt;LF&gt;,所以有一个额外的空行。我该如何解决这个问题?

New resulting file

【问题讨论】:

  • 从示例文件来看,&lt;CR&gt;&lt;LF&gt; 只是文字文本,因此要替换 \r\n 使用 vbCrvbLfvbCrLfvbNewLine。见\r\n, \r and \n what is the difference between them?
  • @user692942 请看我的编辑,我发现&lt;CR&gt;&lt;LF&gt; 实际上并不是明文。不知道为什么我的问题被关闭了,因为我只是编辑它:(
  • 分别与vbCrvbLf 相同。您需要了解在 VBScript 中指定回车符和换行符的不同方式,因此需要了解重复项以及关闭问题的原因。
  • @user692942 谢谢,我明白这一点,但在我的问题和您链接的问题中,这些方法似乎并没有完全删除所有换行符。就我而言,最后一个换行符仍然存在。这正常吗?

标签: command-line vbscript command-line-arguments


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的帮助。我知道 Notepad++ 中的这种替换功能,但我不想手动编辑所有文件。我想用我的脚本自动化这个过程,因为每天会有多个文件在不规则的时间。
【解决方案2】:

我会尝试 "~" & vbCrLF & "" 作为搜索。 vbCrLf 是新行回车组合的常量。

【讨论】:

  • 其实应该是"~" &amp; vbCrLf &amp; "&lt;CR&gt;&lt;LF&gt;",但是它需要在脚本文件中运行,因为你不能在命令行上传递vbCrLf,只有VBScript能理解。
【解决方案3】:

从命令行或批处理文件中执行此操作要容易得多。但是由于您使用的是 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

【讨论】:

  • 感谢您的回答。我想我做了你所描述的方式略有不同。你介意看看我的编辑,看看你能不能帮忙?我解决了大部分问题,但我还有一个小问题......
  • 基本上只是拿了什么I said 1 hour earlier
  • @MERNboy 我已回复您的编辑。
  • @Nilpo 谢谢,这是我正在寻找的解决方案!
猜你喜欢
  • 2019-10-24
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 2013-11-01
相关资源
最近更新 更多