解析十六进制内容的文本文件

时间:2010-08-26 14:47:06

标签: c# regex parsing

我有这个包含大约22 000行的文本文件,每行看起来像这样:

12A4 (Text)

所以它的格式为4个字母/数字(十六进制),然后是文本。有时文本中有多个值,用逗号分隔: A34d (Text, Optional)

有没有有效的方法来搜索十六进制,然后返回括号中的第一个文本?如果我将这些数据存储在SQLite中会更有效吗?

6 个答案:

答案 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的数据。

我认为你可以:

  1. 阅读整个文件
  2. 分割键中的每一行(十六进制数)和值(剩余的)Chris Persichetti答案非常适合
  3. 将每一行存储在字典中(使用数字作为int,也不作为字符串)

    d = Dictionary<int,string>
    d.put( int.Perse( key ), value );
    
  4. 将该字典保存在内存中,然后通过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
  • hexString =行
  • 中前4个字符的子字符串
  • 存储字符串的其余部分

要查找第一部分,请创建一个从“(A,B,C,...)”中检索“A”的函数

如果你可以在“A”中排除逗号“,”,那么你很幸运:删除括号,拆分“,”并返回第一个子串。