0

vb .NET で、ファイルの最後の空行をプログラムで削除する必要があります。空行が 1 行しかない場合もあれば、2 行ある場合もあります (ただし、それ以上になることはありません)。

今のところ、これらのコード行を使用します。

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 に置き換える方法がわかりません。

4

4 に答える 4

0

ストリーム内のデータが文字列に変換されているため、正規表現を使用して一致させ、複数の CRLF の可能性を置き換えます。正規表現プロセッサのニュアンスの 1 つは、右から左に動作するように指定できることです。したがって、最後から始めます。

次のパターンは末尾 ($) で始まり、CRLF (最大 2 セット、または \r\n の 4 文字まで) を 1 つの CRLF に置き換えます。何もない場合は、文字セットのいずれにも一致しない場合でも、最後に 1 つを置き換えます (実際には挿入します)。

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
'***
于 2013-02-12T20:03:20.867 に答える
0

私だったら、ファイルの長さを変更することを検討します - ファイルストリームで SetLength を試してください。フラッシュして閉じます。

于 2013-02-12T19:40:24.687 に答える
0

あなたが持っているテキストの最後から CR と LF をトリミングしたいので、.TrimEnd を使用することもできます:

strEOF = strEOF.TrimEnd(vbCrLf.ToArray) & vbCrLf
于 2013-02-12T20:19:03.537 に答える