获取数据解析文本文件

时间:2015-09-18 13:03:41

标签: c#

我正在尝试解析在文本中生成的日志文件。我想要检索姓名和电话号码。 有时候信息不存在,应该是空白的。

我见过的所有例子都告诉我如何获取字符串的开头或字符串的结尾但不是内部的内容。

上面有一个我一直在使用的示例代码

  {
       public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {

        using(TextReader reader = new StreamReader("c:/ctb.txt"))
        {
            string line;                       
            while ((line = reader.ReadLine()) != null)
            {
                // Get the contents of 'per_full_name' [str] = "Smith, John"
                // which would be Smith, John
                // Get the contents of 'per_phone' [str] = "1 555 555-8888"
                // which would be 1 555 555-8888
                // Note this exists atleast twice in the file, I only need
                // Once into a string to be able to make textBox.
                // Text values change.
            }
        }
    }
    }

示例文本文件数据:

它是一个文本文件,格式对我来说是未知的,我相信它的java输出是为了它自己的日志文件。

[str] = "BI Shared Expense" 'org_level4_name' [str] = "Business      International Ins" 'org_level4_oid' [str] = "Business" 'per_first_name' [str] = "" 'per_full_name' [str] = "Smith, John" 'per_last_name' [str] = "" 'per_middle_name' str] = "" 'per_phone' [str] = "1 555 555-8888" 'qpriority' [str] = "norm" 

没有文字包装时非常长的文字行。

我想要的输出是字符串的全名。能够用于其他功能。

IE:

          string fullname = "Smith, John";

现在尝试使用此代码。

    private void button1_Click(object sender, EventArgs e)
        {
        using (StreamReader sr = new StreamReader("C:/ctb.txt"))
        {

            String line = sr.ReadToEnd();
            foreach (Match m in Regex.Matches(line, "/\\[(str)\\]\\ = \"\\w+\\, +\\w+\"/g"))
            {
                textBox1.Text = m.Value;
                richTextBox1.Text = textBox1.Text;
            }
        }
    }

使用此页面获取字符串但在实际程序中需要转义。 http://www.regexr.com/3bqll

这只能找到'per_full_name'[str] =“Smith,John”

2 个答案:

答案 0 :(得分:1)

我建议使用正则表达式,特别是电话号码。 C#有一个名为Regex的类,它提供搜索特定和动态字符串的函数。

此网站将帮助您构建正则表达式。 http://www.rexegg.com/regex-quickstart.html

如果您的语音符号遵循以下语法,则为示例:  1 555 555-8888 你可以用这个:          \ d {1} \ s \ d {3} \ s \ d {3} - \ d {4}或\ d {2,}( - \ s)\ d {}

答案 1 :(得分:0)

我最终选择了以下内容,感谢您建议查看正则表达式。

private void button1_Click(object sender, EventArgs e)
    {            
        using (StreamReader sr = new StreamReader("C:/ctb.txt"))
        {

            String line = sr.ReadToEnd();
            foreach (Match m in Regex.Matches(line, "\\[(str)\\]\\ = \"\\w+\\, +\\w+\""))
            {
                string name = m.Value.Replace("[str] = \"", "");
                name = name.Replace("\"", "");
                textBox1.Text = name;
            }

        }
        using (StreamReader sr2 = new StreamReader("C:/contacttoolbar.txt"))
        {
            String line = sr2.ReadToEnd();
            foreach (Match m2 in Regex.Matches(line, "\\[(str)\\]\\ = \"\\d\\s\\d{3}\\s\\d{3}-\\d{4}\""))
            {
                string tele = m2.Value.Replace("[str] = \"", "");
                tele = tele.Replace("\"", "");
                textBox2.Text = tele;
            }
        }
    }

这最初将位于正则表达式搜索中 - [str] =" Smith,John" 然后我解析它以删除str部分然后"在末尾。给出我想要的输出。

导致史密斯,约翰

同样适用于电话号码。

导致 1 555 555-5555

我知道它对文件的两次读取,但它是一个小文件。相对。