我正在编写此程序来替换文本文件中字符串第n个位置的字符。我的文本文件包含以下内容 -
the quick brown fox jumped over the lazy dog
the quick brown fox jumped over the lazy dog
the quick brown fox jumped over the lazy dog
the quick brown fox jumped over the lazy dog
这是代码的输出 -
thehuick brown fox jumped over the lazy dog
以上结果不是我想要的。只更新了一行,其余的行不再在文件中找到。
这是我在C#中的完整代码
var txtFiles = Directory.GetFiles(@"E:\PROJ\replaceY\replaceY\", "*.txt");
foreach (string currentFile in txtFiles)
{
string[] lines = File.ReadAllLines(currentFile);
foreach (string line in lines)
{
var theString = line;
var aStringBuilder = new StringBuilder(theString);
aStringBuilder.Remove(3, 2);
aStringBuilder.Insert(3, "h");
theString = aStringBuilder.ToString();
using (StreamWriter outfile = new StreamWriter(currentFile))
{
outfile.Write(theString.ToString());
}
Console.WriteLine(theString);
Console.ReadKey();
}
}
我哪里出错了?请帮忙!
答案 0 :(得分:6)
因为你的逻辑说:
这意味着您反复使用最新行覆盖该文件。最后,每个文件只包含一行:最后一行。
你会想做这样的事情:
static void Main(string[] args)
{
foreach ( string fileName in args )
{
string tempFileName = Path.GetTempFileName() ;
using ( Stream tmpFile = File.Open( tempFileName , FileMode.OpenOrCreate , FileAccess.Write , FileShare.None ) )
using ( StreamWriter output = new StreamWriter( tgtFile , Encoding.Default ) )
using ( Stream srcFile = File.Open( fileName , FileMode.Open , FileAccess.ReadWrite , FileShare.None ) )
using ( StreamReader input = new StreamReader( srcFile , Encoding.Default , true ) )
{
string line ;
while ( null != (line=input.ReadLine()) )
{
output.Write( line.Substring(0,3) ) ;
output.Write( 'h' ) ;
output.WriteLine( line.Substring(5) ) ;
}
}
string backupFileName = string.Format( "{0}.{1:yyyy-MM-dd.HHmmss}.bak" , fileName , DateTime.Now ) ;
File.Move( fileName , backupFileName ) ;
File.Move( tempFileName , fileName ) ;
File.Delete( backupFileName ) ;
}
return;
}
您需要添加一些try/catch/finally
异常处理来处理文件向南的情况,这样您就可以将该文件回滚到原始状态。
其他选择是
File.ReadAllLines()
或等效的这会带给你这样的东西:
static void Main(string[] args)
{
foreach ( string fileName in args )
{
string[] lines = File.ReadAllLines( fileName ) ;
for ( int i = 0 ; i < lines.Length ; ++i )
{
lines[i] = ApplyTransformHere( lines[i] ) ;
}
File.WriteAllLines( fileName , lines ) ;
}
return;
}
答案 1 :(得分:3)
我在每个设置为false的新文件的开头创建了一个布尔附加,因此它为第一行创建一个新文件,然后设置append = true,以便每个后续行都附加在
上var txtFiles = Directory.GetFiles(@"E:\PROJ\replaceY\replaceY\", "*.txt");
foreach (string currentFile in txtFiles)
{
var append = false;
string[] lines = File.ReadAllLines(currentFile);
foreach (string line in lines)
{
var theString = line;
var aStringBuilder = new StringBuilder(theString);
aStringBuilder.Remove(3, 2);
aStringBuilder.Insert(3, "h");
theString = aStringBuilder.ToString();
using (StreamWriter outfile = new StreamWriter(currentFile, append))
{
outfile.Write(theString.ToString() + Environment.NewLine);
}
append = true;
}
}
答案 2 :(得分:2)
在旁注但仍然相关。您是否考虑使用Regex替换所有行?
https://regex101.com/r/aC6cY1/1
赞http.get({
host: 'example.com',
path: '/some/path/',
port: 8080
}, function(resp){
resp.on('data', function(d){
console.log('data: ' + d)
})
resp.on('end', function(){
console.log('** done **')
})
}).on('error', function(err){
console.log('error ' + err)
})
/(?<=^.{4,4})./gm
关于你的问题,我会:
string input = "";//your sample text above
string pattern = "(?<=^.{4,4}).";
string replacement = "h";
Regex rgx = new Regex(pattern, RegexOptions.Multiline);
string result = rgx.Replace(input, replacement);
答案 3 :(得分:0)
取出第二个foreach循环,用一个字符串数组替换它。然后在第一个foreach循环下将字符串数组写入文件。这应该解决你的逻辑问题。