2016-12-03 47 views
-1

在Visual C#中,我正在执行的按钮需要读取.txt文件,并检查文本文件上的每一行是否以特定字符结尾,如果是,则将该行上的名称打印出来并打印到消息框。到目前为止,我已经设法检查行尾是否存在指定字符的条件,但无法获取名称,因为它位于两组数字之间。该名称紧跟在行上的第一个字符之后,就在一组数字开始之前,因为它们是用户的ID。如何在文本文件的一行中获取特定的句子?

这是到目前为止我的代码内按钮:

private void button1_Click(object sender, EventArgs e) 
    { 
     string line, lastchar; 
     // Read the file and display it line by line. 
     System.IO.StreamReader file = new System.IO.StreamReader(@"rato.txt"); 
     while ((line = file.ReadLine()) != null) 
     { 
      lastchar= line.Substring(line.Length - 1, 1); 
      if (lastchar== "2") MessageBox.Show("Prints the name of the user here"); 
     } 
     file.Close(); 
    } 

这是文本文件:

1Paulo111.111.111-11addaqwe2 
2Rambo425.433-628-43ererssd3 
1Momba111.111.111-11asdsad4432 
1Mauricio111.111.111-22wwcssfd2 
1Saulo111.111.111-11qwe1231231 

使按键需要检查,如果当前行与“2”结束并在行中打印名称。例如,第一行中的名称是Paulo,当它以“2”结尾时,“Paulo”将被打印到消息框,就像第三行和第四行一样。否则,它会跳到下一行。 然后它将被打印在消息框中:“Paulo,Momba,Mauricio。

我该怎么做?

+2

查找“正则表达式”(https://msdn.microsoft.com/en-us/library/hs600312(v=vs.110).aspx) –

回答

2
var names = File.ReadLines(filename) 
       .Where(line => line.EndsWith("2")) 
       .Select(line => Regex.Match(line, @"\p{L}+").Value) 
       .ToList(); 

这将返回一个包含Paulo, Momba, Mauricio.

PS列表:\p{L}:任何Unicode的信。

+0

如何打印? – Kankz

+0

@Kankz你知道如何循环列表吗? (例如'for','foreach'等.....) –

+0

我不知道,你能向我解释一下吗? http://prntscr.com/deymgd – Kankz

1

我同意@ L.B的回答和推荐学习正则表达式的评论。这将是一个干净的方法来解决你的问题。我猜你是C#的新手,所以我会提供相应的答案。您应该查看String类的文档。有几种方法和属性您可能会觉得有用。在你的情况下,我们可以看看使用String.EndsWith方法和String.IndexOfAny方法。有了这些方法,我们可以对代码进行一些修改,使其更清晰易懂。

首先让我们看一下这一行 - 你写的代码将为你当前的字符串创建一个字符的子字符串,然后你将它与另一个字符串进行比较。你想要知道字符串是否以'2'结尾,所以我们可以使用EndsWith方法来获取这些信息。

lastchar= line.Substring(line.Length - 1, 1); 
if (lastchar== "2") 

目前可以写为:

if (line.EndsWith("2")) 

现在你也想找个名字,这将分两步走。首先,我们需要找到名称后面的第一个非字母字符的索引,然后我们可以创建一个子字符串并将其显示在消息框中。

var numbers = ".-".ToCharArray(); 
if(line.EndsWith("2")) 
{ 
    // Get the index of the first non-letter character after the name 
    var index = line.IndexOfAny(numbers, 1); 
    var name = line.SubString(1, index - 1); 
    MessageBox.Show(name); 
} 

如果你想知道var类型。它只是语法糖,它允许编译器解释类型,因此您不必编写类型名称。

+0

谢谢,但它没有显示任何内容,有什么不对? http://prntscr.com/df9v4v – Kankz

+0

@Kankz - 我不知道。你应该通过一个调试器来检查它,看看你是否得到了正确的数据,看它是否正在读取文件,检查该行的值是什么,查看名称的值等。从截图中,我可以'回答这些问题。 – pstrjds

相关问题