我需要一个关于如何在引号之间读取文本文件数据的“想法”。例如:
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"
这就是我想在“。
之间阅读的原因很抱歉,如果这太复杂了,而且有点难以解释。
编辑: 感谢所有的反馈人员,但我不确定你是否得到了我想要做的事情:不是你的错,我写的有点奇怪。
我将有一个充满引用和文本的文本文件。像这样。
里面的文字:
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,然后在“。
之间的下一行中读取字符串。然后我将填入我的程序,该程序将refrence与字符串匹配。
但有时文字不止一行。
Refren: "this is text that goes and then
return keys on some parts."
我仍然希望它通读“。
答案 0 :(得分: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
}
答案 1 :(得分:1)
你可以通过调查state machines来学习一些新的技巧。基本上:一次读取每个角色并弄清楚你现在处于什么状态。首先,将其编码为一个内置大while
语句的大switch
循环。然后,继续阅读state pattern,了解如何以面向对象的方式执行此操作。然后,抛弃它并使用delegate
s,因为c#使这些东西变得如此容易。
然后,全部废弃,写一些带有多线标志的蹩脚Regular Expression并以Perl方式啜饮它。思考为什么这与原始状态机解决方案相同。
然后,真的陷入困境并了解parser generators(lexx / yacc或某些.NET variant)并为您的问题编写一个简单的BNF语法。请特别注意教程中使用的普通语法如何比您需要编写的语法更复杂。为什么会这样?看看Noam Chomsky对此有何看法。
最终,你会筋疲力尽。大家都这样做。但是,如果能够让编程成为地球上最酷的活动,那么您将获得如此多的乐趣。倦怠只是意识到这是一个白日梦;)
当你完成后,去外面。认识人。谈论。笑了很多要友好。你现在是一个带着邪恶笑容的zen infused developer。谢谢你!你摇滚!
答案 2 :(得分:0)
要阅读您可以使用的文件的所有行:
File.ReadAllLines(pathToFile);
从“”中剥离文本,您可以使用字符串的子字符串方法:http://msdn.microsoft.com/en-us/library/aka44szs.aspx
你可以这样做:string strippedString = original.Substring(1, original.length -2);
答案 3 :(得分:0)
试试这个
var text = File.ReadAllLines(pathToFile);
var lines = text.Split(':')
.Where((s,i) => i % 2 != 0)
.Select(s => s.trim('"'));
答案 4 :(得分:0)
答案 5 :(得分: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阅读器可能是你最好的选择。
答案 6 :(得分: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/