从txt中的500k个条目中搜索一个字符串

本文关键字:字符串 一个 搜索 中的 txt 500k | 更新日期: 2023-09-27 18:25:15

我有一个.txt文件,其中有大约500k个条目,每个条目用新行分隔。文件大小约为13MB,每行的格式如下:

SomeText<tab>Value<tab>AnotherValue<tab>

我的问题是从程序的输入中,从文件的第一列中找到某个"字符串",并从这两列中获得相应的ValueAnotherValue

第一列未排序,但文件中的secondthird列值实际上已排序。但是,这种排序对我没有什么用处

该文件是静态的,不会更改。我想在这里使用Regex.IsMatch(),但我不确定这是否是逐行进行的最佳方法。

如果查找时间会急剧增加,我可能会重新排列第一列(从而取消对secondthird列的排序)。如有需要,对如何实施此方法或上述方法有何建议?

在定位字符串之后,我应该如何获取这两个列值?

编辑我意识到,在文件中会有相当多的搜索用户的至少一个请求。如果我有一个要查找的值数组,我如何返回具有已查找匹配项的相应值的某种字典?

从txt中的500k个条目中搜索一个字符串

也许使用以下代码:

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.ReadLinesFile.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);
}