[英]Need to get Specific lines of text from a text file C#
我有一个看起来像这样的文本文件:
DeltaV User List - 17 Jun 2013
SUPPLY_CHAIN
UserID Full Name
BAINC C M B
BEEMANH H B
CERIOJI J M C
LADUCK K L
MAYC C M
NEWTONC C N
DeltaV User List - 17 Jun 2013
FERM_OPER
UserID Full Name
POULIOTM M P
TURNERM7 M T
我需要为C#中的每个部分获取单独的用户,但我不确定该怎么做。 我使用的是StreamReader类,它用于获取Area名称(全部大写的单词),但似乎无法获得所有用户。 我有一个包含2个字符串Name&Area的用户类,并且试图创建一个用户对象列表。
到目前为止,这是我尝试过的操作:(我在代码前面声明了User对象的列表)
// read user list text file
var userReader = new StreamReader(File.OpenRead(UserListPath));
while(!userReader.EndOfStream)
{
var line = userReader.ReadLine();
var newUser = new User();
if(line.Contains("DeltaV User List"))
{
var Area = userReader.ReadLine();
newUser.Area = Area;
userReader.ReadLine();
userReader.ReadLine();
userReader.ReadLine();
var userid = userReader.ReadLine();
Console.WriteLine(userid);
var name = userid.Split(' ');
Console.WriteLine(name[0]);
newUser.UserId = name[0];
}
Users.Add(newUser);
}
哦,我只需要获取UserId,也不需要全名。
已编辑
这是一小段代码,应该可以满足您的需求:
using (var fileStream = File.OpenRead(UserListPath))
using (var userReader = new StreamReader(fileStream))
{
string currentArea = string.Empty;
string currentToken = string.Empty;
while (!userReader.EndOfStream)
{
var line = userReader.ReadLine();
if (!string.IsNullOrEmpty(line))
{
var tokenFound = Tokens.FirstOrDefault(x => line.StartsWith(x));
if (string.IsNullOrEmpty(tokenFound))
{
switch (currentToken)
{
case AreaToken:
currentArea = line.Trim();
break;
case UserToken:
var array = line.Split(' ');
if (array.Length > 0)
{
Users.Add(new User()
{
Name = array[0],
Area = currentArea
});
}
break;
default:
break;
}
}
else
{
currentToken = tokenFound;
}
}
}
}
该程序假定您的输入文件以换行符结尾。 它使用您必须在类中或所需的任何地方通过修改它们的访问器(例如, private
到public
)来声明的常量:
private const string AreaToken = "DeltaV";
private const string UserToken = "UserID";
private List<string> Tokens = new List<string>() { AreaToken, UserToken };
当然,我已经按照自己的方式做了,可能有很多更好的方法。 以您想要的方式对其进行改进,它只是一种可以编译和工作的草稿。
除其他外,您会注意到:
Tokens
)中添加新的常量,并扩展切换用例以处理新的文件Token /场景 最后,不要忘记实例化您的User
列表:
List<User> Users = new List<User>();
这是我的工作:
void Main()
{
var filePath = @"..."; //insert your file path here
var lines = File.ReadLines(filePath); //lazily read and can be started before file is fully read if giant file
IList<User> users = new List<User>();
var Area = string.Empty;
foreach(var line in lines)
{
if(string.IsNullOrWhiteSpace(line) ||
line.Contains("DeltaV User List") ||
line.Contains("UserID")
)
{
continue;
}
var values = line.Split(' ');
if(values.Length == 1)
{
Area = values[0];
continue;
}
var currentUser = new User
{
Name = values[0],
Area = Area
};
users.Add(currentUser);
}
users.Dump("User List"); //Dump is a Linqpad method to display result see screen shot
}
// Define other methods and classes here
public class User
{
public string Name { get; set; }
public string Area { get; set; }
}
您发布的文件的结果:
LinqPad用于测试小的代码片段。
您可以将其复制并粘贴到LinqPad中,以根据需要进行修改,只需为其提供一个文件即可。
// read user list text file
var userReader = new StreamReader(File.OpenRead(UserListPath));
var Area = "";
while(!userReader.EndOfStream)
{
var line = userReader.ReadLine();
if(line.Contains("DeltaV User List"))
{
Area = userReader.ReadLine(); // Area applies to group of users below.
userReader.ReadLine(); // blank line
userReader.ReadLine(); // blank line
userReader.ReadLine(); // User ID header line
}
else
{
if (line.trim() != "") // Could be blank line before "DeltaV..."
{
var userid = line;
var newUser = new User();
newUser.Area = Area;
// I left the following lines in place so that you can test the results.
Console.WriteLine(userid);
var name = userid.Split(' ');
Console.WriteLine(name[0]);
newUser.UserId = name[0];
Users.Add(newUser);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.