![](/img/trans.png)
[英]How to read text file lines after Specific lines using StreamReader
[英]How to read a text file for a specific word in lines and write the entire lines to another text file?
我有以下行的文本文件(说text1.txt):
4410 Rel testRel1
4411 Dbg testDbg1
4412 Dbg testDbg2
4412 Rel testRel2
4413 Rel testRel3
4413 Dbg testDbg3
4414 Rel testRel4
4415 Rel testRel5
现在,我想写所有以“相对”两个字到一个文本文件中的行(说text2.txt)。 所以我text2.txt应该是这样的:
4410 Rel testRel1
4412 Rel testRel2
4413 Rel testRel3
4414 Rel testRel4
4415 Rel testRel5
最后,我的代码应读取text2.txt,以text1.txt的路径作为输入,返回text2.txt最后一行(即4415)的前四个字符。 下面是我的代码。 可能是我可能已经写了一半,并与不知道的C#。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;
using System.IO;
using Microsoft.TeamFoundation.Build.Client;
namespace Build_Tasks.Activities
{
[BuildActivity(HostEnvironmentOption.All)]
public sealed class GetBuildNumber : CodeActivity
{
// Define an activity input argument of type string
public InArgument<string> TextFileName { get; set; }
public OutArgument<string> setBuildNumber { get; set; }
private string temp_FilePath = "c:\\temp.txt";
// If your activity returns a value, derive from CodeActivity<TResult>
// and return the value from the Execute method.
protected override void Execute(CodeActivityContext context)
{
// Obtain the runtime value of the Text input argument
string TextFileName = context.GetValue(this.TextFileName);
string TextFilePath = TextFileName;
string[] Lines = File.ReadAllLines(TextFilePath);
//string wordrel = "Rel";
System.IO.StreamReader file = new System.IO.StreamReader(TextFilePath);
List<string> Spec = new List<string>();
string line;
System.IO.StreamWriter file2 = new System.IO.StreamWriter(temp_FilePath);
while ((line = file.ReadLine()) != null)
{
if(line.Contains("Rel"))
{
file2.WriteLine(line);
}
}
var lastline = File.ReadLines(temp_FilePath).Last();
string number = lastline.Substring(0, 4);
context.SetValue<string>(this.setBuildNumber, number);
}
}
}
尝试这个....
static void Main(string[] args)
{
int counter = 0;
string line;
// Read the file(your SXA file) and display it line by line.
System.IO.StreamReader file = new System.IO.StreamReader("c:\\SXA63.txt");
while((line = file.ReadLine()) != null)
{ //File to write lines which contain Rel.
using(StreamWriter writer = new StreamWriter("c:\\Relfile.txt",true))
{
if(line.Contains("Rel"))
writer.WriteLine(line);
}
counter++;
}
String last = File.ReadLines(@"C:\Relfile.txt").Last();
string buildNo = last.Substring(0, 4);
file.Close();
Console.ReadKey();
}
}
如果您仅需要file2
来获取内部版本号,则根本不必创建它:
protected override void Execute(CodeActivityContext context)
{
// Obtain the runtime value of the Text input argument
string TextFileName = context.GetValue(this.TextFileName);
string TextFilePath = TextFileName;
string number = null;
var splitChars = new[]{ ' ' };
foreach (var line in File.ReadLines(TextFilePath))
{
var values = line.Split(splitChars, StringSplitOptions.RemoveEmptyEntries).ToArray();
if (values.Length < 3)
continue;
buildNumber = (values[1] == "Rel" ? values[0] : buildNumber);
}
context.SetValue<string>(this.setBuildNumber, number);
}
而且,由于您只对最后一个内部版本号感兴趣,因此可以通过从不从头开始读取文件,而是从头到尾查找流并跳回直到找到带有Rel
的行来进一步优化。
这将遍历原始文件的各行,并将相关行复制到新文件:
string tempFile = "text2.txt";
List<string> linesWithREL = new List<string>();
using (var sr = new StreamReader("file.txt"))
using (var sw = new StreamWriter(tempFile))
{
string line;
while ((line = sr.ReadLine()) != null)
{
//check if the current line should be copied
if (line.Contains("whatever"))
{
linesWithREL.Add(line.Substring(0,4));
sw.WriteLine(line);
}
}
}
尝试这个:
string path1 = @"C:\data1.txt";
string path2 = @"C:\data2.txt";
string searchKey = "Rel";
List<string> newlines = new List<string>();
foreach (var line in File.ReadLines(path1))
{
if (line.Split(new char[]{' '},
StringSplitOptions.RemoveEmptyEntries)[1].Contains(searchKey))
{
newlines.Add(line);
}
}
File.WriteAllLines(path2,newlines.ToArray());
好的,所以当我阅读一些评论时,您的问题不在读/写中,而是在这一行中:
var lastline = File.ReadLines(temp_FilePath).Last();
您必须先关闭File.ReadLine
,然后才能在同一文件上使用File.ReadLine
。
file2.Flush();
file2.Close();
var lastline = File.ReadLines(temp_FilePath).Last();
如果您想优化代码,则添加了一些答案,无需重复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.