我正在尝试从文本文件中获取某些字符串并将其放入变量中。 这就是文本文件的结构看起来像记住这只是一行,每一行看起来像这样,并用空行分隔:
Date: 8/12/2013 12:00:00 AM Source Path: \\build\PM\11.0.64.1\build.11.0.64.1.FileServerOutput.zip Destination Path: C:\Users\Documents\.NET Development\testing\11.0.64.1\build.11.0.55.5.FileServerOutput.zip Folder Updated: 11.0.64.1 File Copied: build.11.0.55.5.FileServerOutput.zip
我并不完全确定该文本文件的分隔符使用的内容,或者即使我应该使用分隔符,因此可能会对其进行更改。
所以,我只想简单介绍一下我想要发生的事情,我想通过并获取目标路径并将其存储在strDestPath等变量中。
总的来说,到目前为止我提出的代码是:
//find the variables from the text file
string[] lines = File.ReadAllLines(GlobalVars.strLogPath);
不是很多,但我想也许如果我一次只读一行并尝试通过该行搜索我想要的东西但老实说我不是百分之百确定我是否应该坚持这种方式或不......
答案 0 :(得分:4)
如果您对文件的大小持怀疑态度,那么您应该使用{{3>} 延迟执行而不是ReadAllLines
:
var lines = File.ReadLines(GlobalVars.strLogPath);
ReadLines
和ReadAllLines
方法的不同之处如下:
使用ReadLines时,可以在返回整个集合之前开始枚举字符串集合;当您使用ReadAllLines时,必须等待返回整个字符串数组才能访问该数组。因此,当您使用非常大的文件时,ReadLines可以更有效。
答案 1 :(得分:2)
听起来很奇怪,你应该看看日志解析器。如果你可以自由设置文件格式,你可以使用一个适合日志解析器的格式,相信我,它会让你的生活更轻松。
使用日志解析加载文件后,您可以通过用户查询来获取所需信息。如果你不关心在项目中使用interop,你甚至可以添加一个com引用并从任何.net项目中使用它。
此示例读取一个HUGE csv文件,对DB进行批量复制,以执行最后的步骤。这不是你的情况,但向你展示了使用logparser
执行此操作是多么容易COMTSVInputContextClass logParserTsv = new COMTSVInputContextClass();
COMSQLOutputContextClass logParserSql = new COMSQLOutputContextClass();
logParserTsv.separator = ";";
logParserTsv.fixedSep = true;
logParserSql.database = _sqlDatabaseName;
logParserSql.server = _sqlServerName;
logParserSql.username = _sqlUser;
logParserSql.password = _sqlPass;
logParserSql.createTable = false;
logParserSql.ignoreIdCols = true;
// query shortened for clarity purposes
string SelectPattern = @"Select TO_STRING(UserName),TO_STRING(UserID) INTO {0} From {1}";
string query = string.Format(SelectPattern, _sqlTable, _csvPath);
logParser.ExecuteBatch(query, logParserTsv, logParserSql);
LogParser是其中一个隐藏的宝石,微软拥有并且大多数人都不知道。我用来读取iis日志,CSV文件,txt文件等。你甚至可以生成图形!!!
答案 2 :(得分:1)
看起来你需要创建一个Tokenizer。尝试这样的事情:
定义令牌值列表:
List<string> gTkList = new List<string>() {"Date:","Source Path:" }; //...etc.
创建令牌类:
public class Token
{
private readonly string _tokenText;
private string _val;
private int _begin, _end;
public Token(string tk, int beg, int end)
{
this._tokenText = tk;
this._begin = beg;
this._end = end;
this._val = String.Empty;
}
public string TokenText
{
get{ return _tokenText; }
}
public string Value
{
get { return _val; }
set { _val = value; }
}
public int IdxBegin
{
get { return _begin; }
}
public int IdxEnd
{
get { return _end; }
}
}
创建一个查找代币的方法:
List<Token> FindTokens(string str)
{
List<Token> retVal = new List<Token>();
if (!String.IsNullOrWhitespace(str))
{
foreach(string cd in gTkList)
{
int fIdx = str.IndexOf(cd);
if(fIdx > -1)
retVal.Add(cd,fIdx,fIdx + cd.Length);
}
}
return retVal;
}
然后就这样做:
foreach(string ln in lines)
{
//returns ordered list of tokens
var tkns = FindTokens(ln);
for(int i=0; i < tkns.Length; i++)
{
int len = (i == tkns.Length - 1) ? ln.Length - tkns[i].IdxEnd : tkns[i+1].IdxBegin - tkns[i].IdxEnd;
tkns[i].value = ln.Substring(tkns[i].IdxEnd+1,len).Trim();
}
//Do something with the gathered values
foreach(Token tk in tkns)
{
//stuff
}
}