我有这个包含大约22 000行的文本文件,每行看起来像这样:
12A4 (Text)
所以它的格式为4个字母/数字(十六进制),然后是文本。有时文本中有多个值,用逗号分隔:
A34d (Text, Optional)
有没有有效的方法来搜索十六进制,然后返回括号中的第一个文本?如果我将这些数据存储在SQLite中会更有效吗?
答案 0 :(得分:5)
使用子字符串和拆分的示例。
string value = "A34d (Text, Optional)";
string hex = value.Substring(0, 4);
string text = value.Split('(')[1];
if (text.Contains(','))
text = text.Substring(0, text.IndexOf(','));
else
text = text.Substring(0, text.Length-1);
搜索使用词典。
答案 1 :(得分:3)
那可能是< 2 MB的数据。
我认为你可以:
将每一行存储在字典中(使用数字作为int,也不作为字符串)
d = Dictionary<int,string>
d.put( int.Perse( key ), value );
将该字典保存在内存中,然后通过id快速查找
答案 2 :(得分:2)
已经发布了优雅的答案,但是既然你要求正则表达式,试试这个:
var regex = @"^(?<hexData>.{4}\s(?<textData>.*)$)";
var matches = Regex.Matches
(textInput, regex, RegexOptions.IgnoreWhiteSpace
| RegexOptions.Singleline);
然后你通过匹配对象解析得到你想要的任何东西。
答案 3 :(得分:1)
var lines = ...;
var item = (from line in lines
where line.StartsWith("a34d", StringComparison.OrdinalIgnoreCase)
select line).FirstOrDefault();
//if item == null, it is not found
var firstText = item.Split('(',',',')')[1];
它有效,如果你想从firstText
中删除前导空格和尾随空格,那么最后添加一个.Trim()
。
要将文本拆分为多行,请在此处查看我的两个答案。 How can I convert a string with newlines in it to separate lines?
答案 4 :(得分:1)
使用StreamReader进行ReadLine,然后您可以检查第一个字符是否与您搜索的字符相同,以及是否可以执行
string yourresult = thereadline.Split
(new string[]{" (",","},
StringSplitOptions.RemoveEmptyEntries)[1]
答案 5 :(得分:1)
如果您想多次搜索十六进制值,您肯定希望将其存储在某种查找表中。
这可能就像在启动时填充文件内容的Dictionary<string, string>
一样简单:
StreamReader.ReadLine
)要查找第一部分,请创建一个从“(A,B,C,...)”中检索“A”的函数
如果你可以在“A”中排除逗号“,”,那么你很幸运:删除括号,拆分“,”并返回第一个子串。