从文件中删除所有回车和换行
Posted
技术标签:
【中文标题】从文件中删除所有回车和换行【英文标题】:Remove all carriage return and line feed from file 【发布时间】:2017-05-05 02:10:09 【问题描述】:上周我要求你们用 .bat 脚本替换带有换行符的字符串。我已经意识到我的文件已经有一些回车符和换行符,我需要先将其删除,然后再进行替换。 用换行符替换 '#@#@#' 我正在使用下面的行。
(gc $Source) -replace "#@#@#", "`r`n"|set-content $Destination
所以我尝试实现相同的逻辑来替换 \r 和 \n,但是它不起作用。
(gc $Source) -replace "`n", ""|set-content $Destination
我的文件看起来像:
abc|d ef|123#@#@#xyz|tuv|567#@#@#
我需要让它看起来像
abc|def|123 xyz|tuv|567
就像我说的那样,用换行符替换行分隔符是可行的,但我需要先删除所有 cr 和 lf 字符,然后再执行此操作。
对于小文件,下面的脚本可以工作,但我的文件>1.5GB,它会抛出 OutofMemoryException 错误
param
(
[string]$Source,
[string]$Destination
)
echo $Source
echo $Destination
$Writer = New-Object IO.StreamWriter $Destination
$Writer.Write( [String]::Join("", $(Get-Content $Source)) )
$Writer.Close()
【问题讨论】:
我相信它不是重复的,因为我试图删除所有 \r 和 \n。不是组合。我也想用空格替换它们。 所以您尝试删除\r
和 \n
但保留 \r\n
?
不,我正在尝试删除所有 \r 和 \n 。该文件不应该有换行符,因为 '#@#@#' 是行尾字符串。话虽如此,我是否将rowdelimiter设置为#@#@#,然后在powershell中逐行读取以删除\r,\n字符?
当你说你想删除所有 \r 和 \n 但不是组合时,你把我弄糊涂了。我不知道您是否可以在 PowerShell 中使用大于单个字符的分隔符。我的想法是将文件转换为十六进制,删除 0d
和 0a
的所有实例,然后转换回 ASCII。
考虑到它是大文件,转换文件并删除不需要的字符是否省时?对于这种转换,您会推荐什么脚本?它必须是自动化的
【参考方案1】:
这是 vbscript。 Windows 不一致。大多数情况下,它会在 CR 上中断并删除 LF(所有内置编程语言)。但是编辑控件(即记事本)在 LF 上中断并忽略 CR(除非在 LF 之前)。
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
Do Until Inp.AtEndOfStream
Text = Inp.readall
Text = Replace(Text, vbcr, "")
Text = Replace(Text, vblf, "")
Text = Replace(Text, "#@#@#", vblf)
outp.write Text
Loop
这使用了 StdIn 和 StdOut 的重定向。
过滤命令的输出
YourProgram | Cscript //nologo script.vbs > OutputFile.txt
过滤文件
Cscript //nologo script.vbs < InputFile.txt > OutputFile.txt
查看我关于 Windows 命令行的 CMD 备忘单Command to run a .bat file
因此,这会删除以 win.ini 结尾的行并打印以筛选现在的一行 win.ini。
cscript //nologo "C:\Users\David Candy\Desktop\Replace.vbs" < C:\windows\win.ini
【讨论】:
谢谢面条。当我们说做直到时,它会逐行循环吗? 当我们说做直到,它是逐行循环吗?我的文件很大,只有几个回车换行符。这个循环如何读取文件?当我们说直到 Inp.AtEndOfStream 时,它是什么意思? 它曾经做过,但我将其更改为readall
,从而使Do ... Loop
变得不必要(它通过它一次)。在替换语句中的 ""
之间放置一个空格以替换为空格,而不是仅仅删除。所以你可以逐行阅读text = text & out.readline
并在循环外进行写操作。
对不起,我之前没用过任何vb脚本。我的 source 和 tergat 去哪里了?
这是一个命令行的东西,而不是一个 vbscript 的东西。我的回答中有例子。【参考方案2】:
使用以下函数删除特殊字符。将它们全部放入 $SpecChars 中,然后以 Text-data 作为参数调用函数。
Function Convert-ToFriendlyName
param ($Text)
# Unwanted characters (includes spaces and '-') converted to a regex:
#Whatever characters you want to remove, put it here with comma separation.
$SpecChars = '\', ' ','\\','-'
$remspecchars = [string]::join('|', ($SpecChars | % [regex]::escape($_)))
# Convert the text given to correct naming format (Uppercase)
$name = (Get-Culture).textinfo.totitlecase(“$Text”.tolower())
# Remove unwanted characters
$name = $name -replace $remspecchars, ""
$name
希望对你有帮助...!!!
【讨论】:
以上是关于从文件中删除所有回车和换行的主要内容,如果未能解决你的问题,请参考以下文章