2013-02-12 239 views
0

我必须在vb .NET中以编程方式删除文件的最后一行空行。有时候,只有一条空行,有时是两条(但从不多)。删除vb中的最后一个字符(空行)。NET

我使用这些代码行现在在:

fs = New FileStream(Fic_source, FileMode.Open, FileAccess.ReadWrite) 
fs.Seek(-50, SeekOrigin.End) 
Dim strEOF As String = New StreamReader(fs).ReadToEnd() 
strEOF = strEOF .Replace(vbCrLf, "") ' 
strEOF = strEOF .Replace("\r", "") ' Removes every CR/LF/CRLF from the end of the file 
strEOF = strEOF .Replace("\n", "") ' 
strEOF = String.Concat(strEOF , vbCrLf) ' adds an empty line to finish the file correctly 

但我似乎无法弄清楚如何在过去50个字符从我流替换到strEOF,任何人有一个想法?

+0

如何“有时是两个(但绝不会)“翻译成”最后50个字符“?请在你的问题中更精确。另外,请阅读常见问题解答并查看是否可以将您的问题应用于广泛的受众群体。因为这是你的问题太局部化了,必然会在没有答案的情况下关闭。 – 2013-02-12 19:39:39

+1

我不认为'strEOF.Replace(“\ r”,“”)'实际上会将vbCr替换为空字符串。 ''\ n“'相同。 [见此](http://stackoverflow.com/questions/515722/new-line-character-in-vb-net)。 – Neolisk 2013-02-13 01:33:04

+0

你不应该在VB中使用C风格转义。您的替换功能在字面上查看“\ r”和“\ n” - 而不是*查找ASCII 13(“\ r”)和ASCII 10(“\ n”)。 – jinzai 2017-12-20 19:41:07

回答

0

如果是我,我会考虑改变文件的长度 - 在文件流上尝试SetLength。冲洗并关闭。

0

由于您将流中的数据转换为字符串,因此请使用正则表达式来匹配并替换多个CRLF的可能性。正则表达式处理器的一个细微之处是,你可以告诉它从右到左工作;因此从最后开始。

以下模式将从最后($)开始,并用一个CRLF替换任何CRLF(最多两个或四个字符,或者是\ r \ n)。如果没有,那么它将替换为(实际上放在)最后一个,即使它不匹配任何字符集。

dim data = string.Format("ABC{0}DEF{0}{0}", Environment.NewLine) ' 2 CRLF 
dim pattern = "[\r\n]{0,4}$" 

Console.WriteLine("***{0}***", Regex.Replace(data, pattern, Environment.NewLine, RegexOptions.RightToLeft)) 

data = string.Format("ABC{0}DEF", Environment.NewLine) ' No CRLFS 

Console.WriteLine("***{0}***", Regex.Replace(data, pattern, Environment.NewLine, RegexOptions.RightToLeft)) 

' Console Results (note that *** is following each DEF 
'***ABC 
'DEF 
'*** 
'***ABC 
'DEF 
'*** 
0

你想从你的文字端部修整CR和LF,所以你还不如用.TrimEnd:

strEOF = strEOF.TrimEnd(vbCrLf.ToArray) & vbCrLf 
0
Dim objWriter As New StreamWriter(FileNamewithPath, True) 
objWriter.NewLine = Chr(10) 'This works as ENTER on keyboard. This is optional. 
objWriter.WriteLine("The text that is required to write") 
'Loop it to get all the values you need to write. 
'Before the last line. i.e. before your end loop - 1 step 
objWriter.NewLine = "" 'add this 
objWriter.WriteLine("last line to be written"). 
objWriter.Close() 
相关问题