C#:循环访问文本文件,将其拆分并打印一个新的文本文件
本文关键字:文件 文本 一个 打印 拆分 访问 循环 | 更新日期: 2023-09-27 18:31:27
我得到许多行字符串作为输入,如下所示。输入是来自
theObjects.Runstate;
每个@VAR;****;@ENDVAR; 表示循环中的一行和一个步骤。
@VAR;Variable=Speed;Value=Fast;Op==;@ENDVAR;@VAR;Variable=Fabricator;Value=Freescale;Op==;@ENDVAR;
我拆分它以删除不需要的字段,例如 @VAR,@ENDVAR 和 Op==。最佳输出为:
Speed = Fast;
Fabricator = Freescale; and so on.
我能够剪掉@VAR和the@ENDVAR。删除"Op=="不会那么难,所以现在这不是问题的主要焦点。我现在最担心的是,我想将输出打印为文本文件。要打印数组,我必须循环访问它。但是在每次迭代中,当我得到一个新行时,我会用当前拆分的字符串覆盖数组。我认为输入文件的最后一行是一个空字符串,所以我得到的输出只是一个空的文本文件。如果有人能帮助我,那就太好了。
string[] w;
Textwriter tw2;
foreach (EA.Element theObjects in myPackageObject.Elements)
{
theObjects.Type = "Object";
foreach (EA.Element theElements in PackageHW.Elements)
{
if (theObjects.ClassfierID == theElements.ElementID)
{
t = theObjects.RunState;
w = t.Replace("@ENDVAR;", "@VAR;").Replace("@VAR;", ";").Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string s in w)
{
tw2.WriteLine(s);
}
}
}
}
这个 linq-query 给出了 expect 的结果:
var keyValuePairLines = File.ReadLines(pathInputFile)
.Select(l =>
{
l = l.Replace("@VAR;", "").Replace("@ENDVAR;", "").Replace("Op==;", "");
IEnumerable<string[]> tokens = l.Split(new[]{';'}, StringSplitOptions.RemoveEmptyEntries)
.Select(t => t.Split('='));
return tokens.Select(t => {
return new KeyValuePair<string, string>(t.First(), t.Last());
});
});
foreach(var keyValLine in keyValuePairLines)
foreach(var keyVal in keyValLine)
Console.WriteLine("Key:{0} Value:{1}", keyVal.Key, keyVal.Value);
输出:
Key:Variable Value:Speed
Key:Value Value:Fast
Key:Variable Value:Fabricator
Key:Value Value:Freescale
如果要将其输出到另一个文本文件,每行有一个键值对:
File.WriteAllLines(pathOutputFile, keyValuePairLines.SelectMany(l =>
l.Select(kv => string.Format("{0}:{1}", kv.Key, kv.Value))));
根据您在评论中的问题进行编辑:
"我必须更改/添加什么才能使输出像这样。我 需要属性值对,例如:速度 = 快速;或制造商 = 飞思卡尔?
现在我明白了逻辑,你有键值对,但你只对值感兴趣。因此,每两个键值都属于一起,一对的第一个值指定属性,第二个值指定该属性的值(例如速度=快速)。
然后它有点复杂:
var keyValuePairLines = File.ReadLines(pathInputFile)
.Select(l =>
{
l = l.Replace("@VAR;", "").Replace("@ENDVAR;", "").Replace("Op==;", "");
string[] tokens = l.Split(new[]{';'}, StringSplitOptions.RemoveEmptyEntries);
var lineValues = new List<KeyValuePair<string, string>>();
for(int i = 0; i < tokens.Length; i += 2)
{
// Value to a variable can be found on the next index, therefore i += 2
string[] pair = tokens[i].Split('=');
string key = pair.Last();
string value = null;
string nextToken = tokens.ElementAtOrDefault(i + 1);
if (nextToken != null)
{
pair = nextToken.Split('=');
value = pair.Last();
}
var keyVal = new KeyValuePair<string, string>(key, value);
lineValues.Add(keyVal);
}
return lineValues;
});
File.WriteAllLines(pathOutputFile, keyValuePairLines.SelectMany(l =>
l.Select(kv=>string.Format("{0} = {1}", kv.Key, kv.Value))));
在文件中输出单个采样行:
Speed = Fast
Fabricator = Freescale