我有一个文本文件,其中包含这样的内容 我需要获取数据字段的值,即使用in""并且还需要获取标题的值,即使用in""在其他文件中。 在新文件中我只需要 AREA_CODE区号。
我该如何解决这个问题?
答案 0 :(得分:2)
您可以使用File.ReadLines
+字符串方法:
string dataPattern = "Data-field=\"";
string headerPattern = "Header=\"";
var allDataFieldsAndHeader = File.ReadLines(pathToFile)
.Where(l => l.IndexOf(dataPattern, StringComparison.InvariantCultureIgnoreCase) >= 0
&& l.IndexOf(headerPattern, StringComparison.InvariantCultureIgnoreCase) >= 0 )
.Select(l =>
{
int index = l.IndexOf(dataPattern, 0, StringComparison.InvariantCultureIgnoreCase) + dataPattern.Length;
int endIndex = l.IndexOf("\"", index);
string dataField = l.Substring(index, endIndex - index);
index = l.IndexOf(headerPattern, 0, StringComparison.InvariantCultureIgnoreCase) + headerPattern.Length;
endIndex = l.IndexOf("\"", index);
string header = l.Substring(index, endIndex - index);
return new { DataField = dataField, Header = header };
});
使用此示例文件进行测试:
Data-field="DataField Value1" Header="Header Value1"
foo bah
data-field="DataField Value2" Header="Header Value2"
Data-field="DataField Value3" header="Header Value3"
baz
输出:
foreach (var x in allDataFieldsAndHeader)
Console.WriteLine("DataField: {0} Header: {1}", x.DataField, x.Header);
结果:
DataField: DataField Value1 Header: Header Value1
DataField: DataField Value2 Header: Header Value2
DataField: DataField Value3 Header: Header Value3
答案 1 :(得分:0)
尝试将每行文本文件添加到列表中
List<string> lines = new List<string>();
if(File.Exists(path))
{
// Read the file and display it line by line.
System.IO.StreamReader file = new System.IO.StreamReader("c:\\yourtextfilepathhere.txt");
while((line = file.ReadLine()) != null)
{
lines.Add(line);
}
file.Close();
}
然后你可以拿出每个List项目,你说有类似
的东西Data-field="value" and Header="value"
所以你可以检查相应的值
var line1 = lines
.Where(stringToCheck => stringToCheck.Contains(Data-field));
然后取字符串后的相应值
或强>
将文本文件值保存为数组列表 示例强>
string[] lines = System.IO.File.ReadAllLines(@"yourtextfilepath");
然后使用split函数和你的字符串我的意思是Data-field and Header
然后在每个字符串后取值
注意:我希望你知道它的值是什么以及在该值之后会发生什么,所以基于它的分割并保存到字符串然后你可以轻松地将它保存到另一个文件。
答案 2 :(得分:0)
正则表达式是绝对最简单的解决方案。
var matches = Regex.Matches(File.ReadAllText("filename"), "(?<Name>Data-field|Header)=\"(?<Value>.*?)\"")
这将使您有希望参加参赛作品。 为简单起见,您可以将结果转换为字典
var results = matches.Cast<Match>().ToDictionary(x => x.Groups["Name"].Value, x => x.Groups["Value"].Value);
结果现在应包含["Data-field"]
和["Header"]
。
编辑,因为似乎有些可怕的正则表达式,我会解释
(?<Name>Data-field|Header)=\"(?<Value>.*?)\"
是我们正在寻找的正则表达式或模式。它包含两个主要部分:
(?<Name>Data-field|Header)
和
\"(?<Value>.*?)\"
第一个说我们正在寻找一个小组。我们将此组称为名称(这是?<Name>
的含义)。是数据字段|标题。这字面意思是“匹配”数据字段“OR”标题“'。
这两者之间是等号。它意味着:在这里匹配一个等于的字符。
下一部分\"(?<Value>.*?)\"
是与值部分匹配的部分。 \“意味着匹配”。我们只是逃避它,因为“对正则表达式没有任何意义。
.*?
表示'匹配零或多个任何字符,但使用您可以找到的最短匹配'。
句号仅表示“任何字符”,星号表示“前面的图案中的零个或多个”,而问号表示“非贪婪”。非贪婪的部分很重要,否则它可以匹配多个值:
abc="123" newValue="4567"
可能导致Value为123" newValue="4567"
,因为默认行为是贪婪的,并且此表达式可以有多个正确匹配。
这里使用正则表达式的优点是与手动解析器相比,维护非常简单。
正则表达式是一种文本搜索工具,因此尝试使用它来构建复杂的解析器会让你发疯,所以最好将它用于:在文本文档中搜索简单的正则表达式。