C#使用StreamWriter,在特定行附加一个字符串
C# Using StreamWriter, append a string in a specific line
我想用 C# 和 StreamReader/StreamWriter 操作文件。最初,我需要找到一些特定的行,然后在它们之后附加一个字符串。使用这段代码,我可以找到我想在它们之后写的行。
string[] targetValues = {"firstTargetValue"};
List<int> nlines = new List<int>();
string[] newValues = {"firstNewValue" };
int j = 1; //1-based indexing
StreamReader sr = new StreamReader(filepath);
string line = sr.ReadLine();
while (line != null)
{
line = sr.ReadLine();
j++;
if (line == targetValues[0])
{
nlines.Add(j);
}
}
sr.Close();
所以现在我有行号 ( j=5 )。对于最后一部分,我想在此行之后而不是文件末尾写入我的字符串。
var sw = new StreamWriter(filepath,true);
sw.WriteLine(newValues[0]);
sw.Close();
我能否以某种方式使用具有行号的 j 来实现我的目标?
文本示例:
初始文件
1
2
3
4
firstTargetValue
6
7
8
想要的文件
1
2
3
4
firstTargetValue
firstNewValue
6
7
8
在此先感谢,我找不到适合我的答案
你不能用 StreamWriter 做到这一点,但是......为什么不使用另一个流写入器来写出旧文件的内容,直到你要插入新文件的行,然后写入现有文件的其余部分?那就用File的静态方法把旧的删掉,新的重命名为旧的就可以了。
这可能是一个可能的解决方案:
var input = File.ReadAllLines(filepath);
var output = new List<string>();
foreach (var line in input)
{
output.Add(line);
if (line == "firstTargetValue")
{
output.Add("firstNewValue");
}
}
output.ForEach(line => Console.WriteLine(line));
如果不重写整个文件,就不能重写一行。如果文件很小,那么将整个内容读入内存然后再次写出可能是有意义的。
using System.IO;
using System.Linq;
public void InsertToFile(string[] targetValues)
{
string filePath = "filePath";
var txtLines = File.ReadAllLines(filePath).ToList();
foreach (var target in targetValues)
{
txtLines.Insert(txtLines.IndexOf(target), "//new line to be inserted");
}
File.WriteAllLines(filePath, txtLines);
}
另一种解决方法是将 targetValue 替换为 (targetvale + newValue)
using System.IO;
public void InsertToFile(string[] targetValues)
{
string filePath = "filePath";
var text = File.ReadAllText(filePath);
foreach (var target in targetValues)
text.Replace(target, $"{target} new value to be inserted");
File.WriteAllText(filePath, text);
}
我想用 C# 和 StreamReader/StreamWriter 操作文件。最初,我需要找到一些特定的行,然后在它们之后附加一个字符串。使用这段代码,我可以找到我想在它们之后写的行。
string[] targetValues = {"firstTargetValue"};
List<int> nlines = new List<int>();
string[] newValues = {"firstNewValue" };
int j = 1; //1-based indexing
StreamReader sr = new StreamReader(filepath);
string line = sr.ReadLine();
while (line != null)
{
line = sr.ReadLine();
j++;
if (line == targetValues[0])
{
nlines.Add(j);
}
}
sr.Close();
所以现在我有行号 ( j=5 )。对于最后一部分,我想在此行之后而不是文件末尾写入我的字符串。
var sw = new StreamWriter(filepath,true);
sw.WriteLine(newValues[0]);
sw.Close();
我能否以某种方式使用具有行号的 j 来实现我的目标?
文本示例:
初始文件
1
2
3
4
firstTargetValue
6
7
8
想要的文件
1
2
3
4
firstTargetValue
firstNewValue
6
7
8
在此先感谢,我找不到适合我的答案
你不能用 StreamWriter 做到这一点,但是......为什么不使用另一个流写入器来写出旧文件的内容,直到你要插入新文件的行,然后写入现有文件的其余部分?那就用File的静态方法把旧的删掉,新的重命名为旧的就可以了。
这可能是一个可能的解决方案:
var input = File.ReadAllLines(filepath);
var output = new List<string>();
foreach (var line in input)
{
output.Add(line);
if (line == "firstTargetValue")
{
output.Add("firstNewValue");
}
}
output.ForEach(line => Console.WriteLine(line));
如果不重写整个文件,就不能重写一行。如果文件很小,那么将整个内容读入内存然后再次写出可能是有意义的。
using System.IO;
using System.Linq;
public void InsertToFile(string[] targetValues)
{
string filePath = "filePath";
var txtLines = File.ReadAllLines(filePath).ToList();
foreach (var target in targetValues)
{
txtLines.Insert(txtLines.IndexOf(target), "//new line to be inserted");
}
File.WriteAllLines(filePath, txtLines);
}
另一种解决方法是将 targetValue 替换为 (targetvale + newValue)
using System.IO;
public void InsertToFile(string[] targetValues)
{
string filePath = "filePath";
var text = File.ReadAllText(filePath);
foreach (var target in targetValues)
text.Replace(target, $"{target} new value to be inserted");
File.WriteAllText(filePath, text);
}