所以我的目标是编写一个C#程序,它将读取包含数千行的.txt文件,并重新格式化某些条件行。
我会读取每一行并检查此行是否包含1901
,如果有,我想对该行进行更改。
例如这一行,
T1.hello < 1901, AS bye
我想用它替换它,
T2.hello AS bye
在这种情况下,hello
和bye
是我要保留的两个数据,并且从T1.data1 < 1901, AS data2
到T2.data1 AS data2
的转接格式当且仅当旧的时候行包含1901
。
请注意data1
和data2
可以是任何数据,但并不总是hello
和bye
我从来没有在C#中使用IO,所以我的想法已经用完了,到目前为止,我的代码如下,我被困在我的代码的if
语句中,我需要一些指导如何处理这种情况:
string path = @"C:\Users\jzhu\Desktop\test1.txt";
StreamReader reader = new StreamReader(File.OpenRead(path));
string fileContent = reader.ReadToEnd();
reader.Close();
List<string> lines = new List<string>(File.ReadAllLines(path));
for (int i = 0; i < lines.Count; i++)
{
if(lines[i].Contains("1901"))
{
//here is the part I need guidance
}
}
StreamWriter writer = new StreamWriter(File.Create(path));
writer.Write(fileContent);
writer.Close();
答案 0 :(得分:2)
你可以做的是
StringBuilder sb = new StringBuilder();
for (int i = 0; i < lines.Count; i++)
{
if(lines[i].Contains("1901"))
{
sb.AppendLine(lines[i].Replace("< 1901,",""));
}
else
{
sb.AppendLine(lines[i]);
}
}
using (StreamWriter writer = new StreamWriter(path))
{
writer.Write(sb.ToString());
}
这将假设您知道要用空字符串替换“&lt; 1901”。
答案 1 :(得分:1)
我认为这是正则表达式的一种情况,因为您希望在T1之后捕获可变数量的数据并保留它。尝试这样的事情:
string pattern = "T1.([^ ]+) < 1901,( .*)";
Regex rgx = new Regex(pattern);
for (int i = 0; i < lines.Count; i++)
{
Match m = rgx.Match(lines[i]);
if (m.Success == true) {
lines[i] = rgx.Replace(lines[i],"T2." + m.Groups[1] + m.Groups[2]);
}
}
模式中()
s中的内容是将被捕获的内容,成为Match
对象上的组(匹配中的第一个组 - 索引0 - 是整个匹配的本身)。
所以([^ ]+)
在&#39; T1&#39;之后找到所有内容。在遇到空格并将其填入Match
组2(索引1)之前,这不是空格。
( .*)
在&#39; 1901之后发现,以空格开头,随后重复任何次数.*
,并将其填入第3组(索引2) )。由于这些项目保存在组中,因此您现在可以在编写替换字符串时检索它们。
答案 2 :(得分:0)
使用Regex.Replace
string path = @"C:\Users\jzhu\Desktop\test1.txt";
List<string> lines = new List<string>(File.ReadAllLines(path));
for (int i = 0; i < lines.Count; i++)
{
lines[i] = Regex.Replace(lines[i], @"T1\.([^ ]*) < 1901, AS", "T2.$1 AS");
}
File.WriteAllLines(path, lines);