【问题标题】:How to read text file between ""如何读取“”之间的文本文件
【发布时间】:2012-05-30 07:46:57
【问题描述】:

我需要一个关于如何读取引号之间的文本文件数据的“想法”。例如:

line 1: "read a title"

line 2: "read a descr"

line 1: "read a title"

line 2: "read a descr"

我想做一个 foreach 类型的事情,我想读取所有第 1 行和第 2 行作为一对,但在“。”之间。

在我的程序中,我将输出(当然是 foreach):

readTerminatedNull(file1);

readTerminatedNull(file2);

我会逐行阅读,但有些文字可能是:

line 1: "read a super long
title that goes off"
line 2: "read a descr"

这就是为什么我想在“。”之间阅读。

对不起,如果这太复杂了,而且有点难以解释。

编辑: 感谢所有反馈的家伙,但我不确定你是否得到了我想要做的事情:p 不是你的错,我写的这个有点奇怪。

我将有一个充满引用和文本的文本文件。像这样。

里面的文字:

Refren: "myrefrence_1"
String: "This is a string of a refrence"
Refren: "myrefrence_2"
String: "hello world"
Refren: "myrefrence_3"
String: "I like cookies."

我希望它在第一行的引号中读取 myrefrence_1,然后在 ".

之间读取下一行中的字符串

然后,我将在我的程序中填充与字符串匹配的引用。

但有时文本会超过一行。

Refren: "this is text that goes and then
return keys on some parts."

我仍然希望它通读“。

【问题讨论】:

    标签: c# file text io


    【解决方案1】:

    (未测试,但你会明白的)

    // Read all text from file
    string sData = File.ReadAllText(@"c:/file.txt");
    
    // Match strings between " "
    Match match = Regex.Match(sData , "\"(\w|\d|\s|\\\")*\"",
                              RegexOptions.IgnoreCase);
    
    // Read results and strip " out of them
    foreach (var sResult in match) {
        sResult = sResult.Remove(0,1).Remove(sResult.length-2, 1);
        // Do whatever with sResult
    }
    

    【讨论】:

    • 哦,哇,我完全忘记了正则表达式。谢谢大佬!
    • 如果他在他的字符串中转义了引号怎么办?
    【解决方案2】:

    您可以通过查看state machines 来学习一些新技巧。基本上:一次阅读每个字符,并弄清楚你现在处于什么状态。首先,将其编码为一个大的while 循环,其中包含一个大的switch 语句。然后,去阅读state pattern,了解如何以面向对象的方式执行此操作。然后,放弃它并使用 delegates,因为 c# 让这些事情变得如此简单。

    然后,全部废弃,用多行标志写一些蹩脚的Regular Expression,然后以Perl 的方式啜饮它。思考一下为什么这与您原来的状态机解决方案相同。

    然后,真正陷入困境并了解parser generatorslexx/yacc 或一些.NET variant)并为您的问题编写一个简单的BNF 语法。请特别注意教程中使用的琐碎语法比您需要编写的语法要复杂得多。为什么呢?看看Noam Chomsky 对此有何评论。

    最终,你会筋疲力尽。大家都这样做。但是你会很有趣地挖掘是什么让编程成为这个星球上最酷的活动。倦怠只是意识到这是一个白日梦;)

    完成后,出去。认识人。讲话。多微笑。友善点。你现在是zen infused developer,带着邪恶的笑容。耶!你摇滚!

    【讨论】:

      【解决方案3】:

      您所描述的内容听起来像是一个单列 CSV 文件。最简单的访问方法可能是使用 Microsoft.VisualBasic.FileIO.TextFieldParser 类,例如:

      using (var csvParser = new TextFieldParser(new StringReader(content))
                                   {
                                       Delimiters = new[] {","},
                                       HasFieldsEnclosedInQuotes = true
                                   })
      {
          while (!csvParser.EndOfData)
          {
              var fields = csvParser.ReadFields();
              Console.Print(fields[0]); //do something with the first (in your case only) field found.
          }
      }
      

      确定这种方法是否有意义的最简单方法可能是考虑如果您正在阅读的字符串实际上包含双引号会发生什么。最终会变成"He said ""this is quoted"", but I wasn't listening"(双引号),还是这种情况不可能?

      如果引号以这种方式加倍,那么像这个内置框架这样的标准 CSV 阅读器可能是你最好的选择。

      【讨论】:

      • 嗯,在问题编辑后,我不再看到这有什么帮助。如果我正确阅读更新后的问题,则输入不是 CSV 文件,因为每一行在引号括起来的目标字符串之前都有一个 something: 前缀。如果这是正确的,那么基于正则表达式的方法或状态机风格的方法(都在其他答案中概述)可能更有意义。
      【解决方案4】:

      要读取文件的所有行,您可以使用:

      File.ReadAllLines(pathToFile);
      

      要从 "" 中删除文本,您可以使用字符串的子字符串方法:http://msdn.microsoft.com/en-us/library/aka44szs.aspx

      你可以这样做:

      string strippedString = original.Substring(1, original.length -2);
      

      【讨论】:

      • 是的,这就是我之前尝试过的,它没有按照我想要的方式输出。不过感谢您的反馈!
      • 我宁愿使用original.Trim('\"'),因为它更符合提问者的想法。另外,您跳过.Length 电话
      【解决方案5】:

      试试这个

      var text = File.ReadAllLines(pathToFile);
      var lines = text.Split(':')
                      .Where((s,i) => i % 2 != 0)
                      .Select(s => s.trim('"'));
      

      【讨论】:

        【解决方案6】:

        首先,您需要使用以下命令读取文件:

        File.ReadAllLines(filePath);

        然后您可以使用string.Split 函数拆分所有行。

        在右括号上拆分是最好的选择。

        【讨论】:

          【解决方案7】:

          据我所知,您的问题是您想使用某些特定设置读取和写入文本文件。是吗 ?

          我想参考 INI 文件,它们是它自己的文本文件,并提供您希望实现的设置配置。这里有一些链接可以帮助你。

          http://www.codeproject.com/Articles/1966/An-INI-file-handling-class-using-C

          http://jachman.wordpress.com/2006/09/11/how-to-access-ini-files-in-c-net/

          【讨论】:

          • 我的想法有点像ini文件。除了设置=this,您还可以设置“this”吗?
          • 我建议您使用具有两列(如 name 、 value)的 csv 以及另一种最佳和推荐的方法来使用具有属性值而不是元素的 xml 文件,或者您可以选择这样的元素以对象和托管方式。
          • 谢谢,这听起来像是我将要做的。我将不得不研究 csv 安排。谢谢!
          猜你喜欢
          • 1970-01-01
          • 2021-11-04
          • 1970-01-01
          • 1970-01-01
          • 2018-01-11
          • 2015-01-18
          • 1970-01-01
          • 1970-01-01
          • 2013-01-04
          相关资源
          最近更新 更多