我有一个大的日志文件,其中多行由新行分隔。每个行条目存储四个值。
如果我正在阅读日志文件并希望存储此信息,我应该使用哪种数据类型/对象?
示例:
source1 destination1 result time source2 destination1 result time sources3 destination2 result time
这些值在行之间不是唯一的,它们可以重复。
我可以为{source,destination,result,time}值的每一行声明一个结构,并将结构对象存储在整个文件的List<T>
中吗?
答案 0 :(得分:3)
是的,您可以采用创建自己的特定课程并制作该课程List
的方法。
根据文件的大小,使用DataTable
执行此操作可以做得更好:
var dt = new DataTable();
dt.Columns.Add(new DataColumn("Source", typeof(string)));
dt.Columns.Add(new DataColumn("Destination", typeof(string)));
dt.Columns.Add(new DataColumn("Result", typeof(string)));
dt.Columns.Add(new DataColumn("Timestamp", typeof(DateTime)));
var dr = dt.NewRow();
dr["Source"] = "DATA";
dr["Destination"] = "DATA";
dr["Result"] = "DATA";
dr["Timestamp"] = DateTime.Now;
dt.Rows.Add(dr);
答案 1 :(得分:3)
是的,这正是我要做的。如果您没有LINQ,则可以将通用List与自己的自定义类一起使用。
public class LogEntry
{
private String _source = String.Empty;
private String _destination = String.Empty;
private String _result = String.Empty;
private String _time = String.Empty;
public String Source
{
get { return _source; }
set { _source = value; }
}
public String Destination
{
get { return _source; }
set { _source = value; }
}
public String Result
{
get { return _source; }
set { _source = value; }
}
public String Time
{
get { return _source; }
set { _source = value; }
}
public LogEntry()
{
}
public LogEntry( String source, String destination, String result, String time )
{
_source = source;
_destination = destination;
_result = result;
_time = time;
}
public LogEntry( String[] args )
{
_source = args[0];
_destination = args[1];
_result = args[2];
_time = args[3];
}
}
然后您可以使用如下列表:
List<LogEntry> _logEntries = new List<LogEntry>();
我会将文件中的每一行读入一个String并创建一个新的LogEntry类,该类传递一个String.Split方法调用的结果。下面的代码是严格的伪代码。
char[] splitter = new char[1];
splitter[0] = ' ';
while( readLines into String )
{
_logEntries.Add( new LogEntry( String.Split( splitter ) ) );
}
这个解决方案非常脆弱,日志文件格式的任何变化都会严重破坏代码,但它会起作用。此外,你打破白色空间,以便更好地确保你真正想要打破的。
答案 2 :(得分:2)
滚动你自己的课程
public class LogEntry
{
public string Source;
public string Destination;
public DateTime ResultTime;
}
然后,您可以在每个输入行上调用Split(),然后将String []的每个元素解析为LogEntry对象。
答案 3 :(得分:2)
class YourType
{
public String Source { get; private set; }
public String Destination { get; private set; }
public String Resoult { get; private set; }
public String Time { get; private set; }
//or func returning bool and remove exception
public YourType(String line)
{
var split = line.Split(' ');
if (split.Length != 4)
throw new ArgumentException();
Source = split[0];
Destination = split[1];
Resoult = split[2];
Time = split[3];
}
}
public Main()
{
String values =
@"source1 destination1 result time
source2 destination1 result time
sources3 destination2 result time";
var v = from line in values.Split(new String[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
select new YourType(line);
foreach (var it in v)
{
Console.WriteLine(it.Source);
}
}