Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从txt中的500k个条目中搜索字符串_C#_C# 4.0 - Fatal编程技术网

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

C# 从txt中的500k个条目中搜索字符串,c#,c#-4.0,C#,C# 4.0,我有一个.txt文件,其中有大约500k个条目,每个条目之间用新行分隔。文件大小约为13MB,每行格式如下: someTextValue另一个值 我的问题是从文件的第一列中找到一个带有程序输入的特定“字符串”,并从两列中获得相应的值和另一个值 第一列未排序,但文件中的第二列和第三列值实际已排序。但是,这种分类对我没有什么用处 该文件是静态的,不会更改。我想在这里使用Regex.IsMatch(),但我不确定这是否是逐行执行的最佳方法 如果查找时间急剧增加,我可能会重新排列第一列(从而取消对第二列

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

someTextValue另一个值

我的问题是从文件的第一列中找到一个带有程序输入的特定“字符串”,并从两列中获得相应的
另一个值

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

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

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

找到字符串后,我应该如何获取这两个列值

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

可能有以下代码:

var myLine = File.ReadAllLines()
   .Select(line => line.Split(new [] {' ', '\t'}, SplitStringOptions.RemoveEmptyEntries)
   .Single(s => s[0] == "string to find");
myLine
是表示行的字符串数组。您还可以使用
.aspallel()
扩展方法来获得更好的性能

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.realllines
,因为您不需要读取整个文件,只需要找到匹配的字符串即可

将这个怪物解析到某种数据库中。
SQL Server/MySQL更可取,但如果由于各种原因无法使用它们,SQLite甚至Access或Excel都可以使用。 只做一次并不难。
完成后,搜索将变得简单而快速。

GetLines(inputPath)。FirstOrDefault(p=>p.Split(“,”[0]==“SearchText”)
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);
}
私有静态IEnumerable GetLines(字符串输入文件) { 字符串filePath=Path.Combine(Directory.GetCurrentDirectory(),inputFile); 返回File.ReadLines(filePath); }
您需要执行多少次此搜索?
如果每次搜索都能节省时间,那么启动时的一些预处理成本值得吗? 启动时将所有数据加载到内存中是否可行? 将文件解析为对象并将结果粘贴到哈希表中

我不认为正则表达式比任何标准字符串选项对您的帮助都大。您正在寻找一个固定的字符串值,而不是一个模式,但我将对此进行更正

更新 假设“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);

}
public IEnumerable Data=new List(){
“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\t其他值8\t”
};
公共类MyData{
公共字符串SomeText{get;set;}
公共字符串值{get;set;}
公共字符串另一个值{get;set;}
}
[测试方法]
public void ParseAndFind(){
变量字典=数据。选择(行=>
{
var pieces=line.Split(新字符[]{'\t'},StringSplitOptions.RemoveEmptyEntries);
返回新的MyData{
SomeText=条[0],
值=件[1],
另一个值=件[2],
};
}).ToDictionary(dat=>dat.SomeText);
Assert.AreEqual(“另一个值3”,字典[“Text3”]。另一个值);
Assert.AreEqual(“Value7”,字典[“Text7”].Value);
}
hth,


艾伦

你有访问RDBMS吗?在一行中的值之间有分隔符吗?@ KAJ:考虑<代码> NeXLe> <代码>作为DelimTy7。如果我对这个文件中的第一列进行排序,你能把搜索的首选方法写进吗?我建议把数据导入数据库文件,而不是对第一列进行排序。无论你如何优化你的搜索,它仍然永远不会匹配一个真正的数据库。我以前已经忘记了-但是比Access和SQLite更好的选择是SQL Server Express,它是客户端可部署的,不需要在客户端上运行任何软件,同时允许您访问诸如全文搜索之类的高级功能,这正是加速搜索所需的。如果我对
第一列数据进行排序,可以缩短时间吗?这取决于具体情况。如果将所有数据加载到内存中,则对已排序数据的搜索速度将更快。然而,加载数据可能需要太多时间,因此优化不值得。我意识到,用户至少会从程序中搜索一个请求。你能详细说明内存中对排序后的第一列数据的处理方法吗?我有点倾向于脱机使用对搜索字符串列进行排序,然后对其执行搜索。要搜索多少次?这取决于运行该程序的用户。事实上,您关于“多少次搜索”的问题让我回到该程序进行尝试。我对我的问题做了一些补充。你能帮忙吗?Thanks@Cipher我发布的答案为您提供了一本字典,您可以使用它查找值。缺少什么吗?我的意思是我有一个
列表
,其中包含要搜索的所有值。我们可以从文本文件中搜索列表中的所有值以返回类似的字典吗?您是否有一个包含所有“SomeText”值的列表,或者一个包含由制表符分隔的行(SomeText、Value、AnotherValue)的列表,即。