1

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

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."

我仍然希望它通读“。

4

7 回答 7

3

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

// 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
}
于 2012-05-30T07:54:02.720 回答
1

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

然后,把它全部废弃,用多行标志写一些蹩脚的正则表达式,然后用Perl的方式把它弄脏。思考为什么这与您的原始状态机解决方案相同。

然后,真正投入并了解解析器生成器lexx / yacc或一些.NET 变体)并为您的问题编写一个简单的BNF语法。请特别注意教程中使用的琐碎语法比您需要编写的语法要复杂得多。为什么呢?看看诺姆乔姆斯基对此有何评论。

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

说完就往外走。认识人。讲话。多微笑。友善点。你现在是一个带着邪恶笑容的禅宗开发者。耶!你摇滚!

于 2012-05-30T07:52:38.467 回答
0

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

File.ReadAllLines(pathToFile);

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

你可以这样做:

string strippedString = original.Substring(1, original.length -2);
于 2012-05-30T07:52:41.643 回答
0

试试这个

var text = File.ReadAllLines(pathToFile);
var lines = text.Split(':')
                .Where((s,i) => i % 2 != 0)
                .Select(s => s.trim('"'));
于 2012-05-30T07:55:01.323 回答
0

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

File.ReadAllLines(filePath);

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

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

于 2012-05-30T07:55:21.073 回答
0

您所描述的内容听起来像是一个单列 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 阅读器可能是你最好的选择。

于 2012-05-30T08:03:36.843 回答
0

正如我从你那里了解到的那样,你想用一些特定的设置来读写文本文件。是吗 ?

我想参考 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/

于 2012-05-30T08:13:06.630 回答