【问题标题】:How to get specific sentence in a line of a text file?如何在文本文件的一行中获取特定的句子?
【发布时间】:2016-12-03 19:09:45
【问题描述】:

在可视化 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.”

我该怎么做?

【问题讨论】:

标签: c# string visual-studio text line


【解决方案1】:
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 字母。

【讨论】:

  • 如何打印?
  • @Kankz 你知道如何循环列表吗? (例如,for、foreach 等.....)
  • @Kankz 算了吧。由于此答案涉及更复杂的内容,例如 linq 和 regex....也许您想在几个月后阅读此答案...
  • 拜托,伙计,这是我项目中唯一缺少的部分,截止日期是今天,你能告诉我在列表框中打印每个以“2”结尾的名称的代码是什么,每行一个?我是新手,没有得到“var”类型,抱歉。
【解决方案2】:

我同意@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 = "0123456789.-".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 类型。它只是允许编译器解释类型的语法糖,因此您不必编写类型名称。

【讨论】:

  • @Kankz - 我不知道。您应该使用调试器逐步完成它,看看您是否获得了正确的数据,查看它是否正在读取文件,检查该行的值是什么,查看名称的值等。从屏幕截图中我可以'不回答这些问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
相关资源
最近更新 更多