从txt中的500k个条目中搜索一个字符串
本文关键字:字符串 一个 搜索 中的 txt 500k | 更新日期: 2023-09-27 18:25:15
我有一个.txt文件,其中有大约500k个条目,每个条目用新行分隔。文件大小约为13MB,每行的格式如下:
SomeText<tab>Value<tab>AnotherValue<tab>
我的问题是从程序的输入中,从文件的第一列中找到某个"字符串",并从这两列中获得相应的Value
和AnotherValue
。
第一列未排序,但文件中的second
和third
列值实际上已排序。但是,这种排序对我没有什么用处
该文件是静态的,不会更改。我想在这里使用Regex.IsMatch()
,但我不确定这是否是逐行进行的最佳方法。
如果查找时间会急剧增加,我可能会重新排列第一列(从而取消对second
和third
列的排序)。如有需要,对如何实施此方法或上述方法有何建议?
在定位字符串之后,我应该如何获取这两个列值?
编辑我意识到,在文件中会有相当多的搜索用户的至少一个请求。如果我有一个要查找的值数组,我如何返回具有已查找匹配项的相应值的某种字典?
也许使用以下代码:
var myLine = File.ReadAllLines()
.Select(line => line.Split(new [] {' ', ''t'}, SplitStringOptions.RemoveEmptyEntries)
.Single(s => s[0] == "string to find");
myLine
是表示一行的字符串数组。为了获得更好的性能,您也可以使用.AsParallel()
扩展方法。
您需要进行多少次此搜索
如果你每次搜索都能节省时间,那么在启动时进行一些预处理的成本值得吗?在启动时将所有数据加载到内存中是否可行?将文件解析为对象并将结果粘贴到哈希表中?
我认为Regex不会比任何标准字符串选项更能帮助你。你正在寻找一个固定的字符串值,而不是一个模式,但我会在这方面得到纠正。
更新假设"SomeText"是唯一的,你可以使用像这样的字典
数据表示来自文件的值。MyData是一个将它们保存在内存中的类。
public IEnumerable<string> Data = new List<string>() {
"Text1'tValue1'tAnotherValue1't",
"Text2'tValue2'tAnotherValue2't",
"Text3'tValue3'tAnotherValue3't",
"Text4'tValue4'tAnotherValue4't",
"Text5'tValue5'tAnotherValue5't",
"Text6'tValue6'tAnotherValue6't",
"Text7'tValue7'tAnotherValue7't",
"Text8'tValue8'tAnotherValue8't"
};
public class MyData {
public String SomeText { get; set; }
public String Value { get; set; }
public String AnotherValue { get; set; }
}
[TestMethod]
public void ParseAndFind() {
var dictionary = Data.Select(line =>
{
var pieces = line.Split(new char[] { ''t' }, StringSplitOptions.RemoveEmptyEntries);
return new MyData {
SomeText = pieces[0],
Value = pieces[1],
AnotherValue = pieces[2],
};
}).ToDictionary<MyData, string>(dat =>dat.SomeText);
Assert.AreEqual("AnotherValue3", dictionary["Text3"].AnotherValue);
Assert.AreEqual("Value7", dictionary["Text7"].Value);
}
hth,
Alan
var firstFoundLine = File.ReadLines("filename").FirstOrDefault(s => s.StartsWith("string"));
if (firstFoundLine != "")
{
char yourColumnDelimiter = ''t';
var columnValues = firstFoundLine.Split(new []{yourColumnDelimiter});
var secondColumn = columnValues[1];
var thirdColumns = columnValues[2];
}
File.ReadLines
比File.RealAllLines
好,因为您不需要读取整个文件——只需要找到匹配的字符串http://msdn.microsoft.com/en-us/library/dd383503.aspx
将这个怪物解析到某种数据库中
最好使用SQL Server/MySQL,但如果由于各种原因无法使用它们,则可以使用SQLite,甚至Access或Excel。一次这样做并不难
完成这些之后,搜索将变得简单快捷。
GetLines(inputPath).FirstOrDefault(p=>p.Split(",")[0]=="SearchText")
private static IEnumerable<string> GetLines(string inputFile)
{
string filePath = Path.Combine(Directory.GetCurrentDirectory(),inputFile);
return File.ReadLines(filePath);
}