从文件中删除所有回车和换行

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 中使用大于单个字符的分隔符。我的想法是将文件转换为十六进制,删除 0d0a 的所有实例,然后转换回 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 &amp; 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

希望对你有帮助...!!!

【讨论】:

以上是关于从文件中删除所有回车和换行的主要内容,如果未能解决你的问题,请参考以下文章

java中的回车和换行的含义及其区别?

Oracle REPLACE() 函数不处理回车和换行

C++中回车换行( )和换行( )的区别

linux与windows文本文件间的转换:针对回车换行

回车和换行...在 C# 中都需要吗?

mysql 查询语句中去除回车和换行