C# 如何将不同格式的清单合并到一个清单中?
我正在寻找一些关于如何将多个不同清单合并为一个清单的提示/建议,该清单捕获每个清单的每个元素 假设我有以下3个清单,格式如下。正如您所看到的,有些元素重复,有些元素是清单所独有的。此外,清单在每个元素下包含数千行 清单1:C# 如何将不同格式的清单合并到一个清单中?,c#,manifest,C#,Manifest,我正在寻找一些关于如何将多个不同清单合并为一个清单的提示/建议,该清单捕获每个清单的每个元素 假设我有以下3个清单,格式如下。正如您所看到的,有些元素重复,有些元素是清单所独有的。此外,清单在每个元素下包含数千行 清单1: Element1|Element2|Element4|Element5| 00000001|00000002|00000004|00000005| 清单2: Element2|Element3|Element4|Element5| 00000002|00000003|000
Element1|Element2|Element4|Element5|
00000001|00000002|00000004|00000005|
清单2:
Element2|Element3|Element4|Element5|
00000002|00000003|00000004|00000005|
清单3:
Element1|Element3|Element4|Element6|
00000001|00000003|00000004|00000006|
我想要的最终清单如下所示:
Element1|Element2|Element4|Element5|Element3|Element6|
00000001|00000002|00000004|00000005|00000003|________|
________|00000002|00000004|00000005|________|________|
00000001|________|00000004|________|00000003|00000006|
如您所见,每个字段都从原始清单中捕获并保存到一个主清单中。如果某个元素在特定清单中不可用,则该行将保留为空。因此,我不确定“清单”是什么意思,并且对输入/输出文件结构或其来源等一无所知。我假设为CSV数据,因此这里有一个示例。希望它能帮助你实现你的目标
class Program
{
static void Main(string[] args)
{
var merger = new CsvMerger(Console.Out);
Guid type1 = merger.RegisterType(new [] { "Element1", "Element2", "Element3" });
Guid type2 = merger.RegisterType(new[] { "Element3", "Element5", "Element6" });
merger.WriteHeaders();
merger.WriteData(type1, "00000001", "00000002", "00000003");
merger.WriteData(type2, "00000003", "00000005", "00000006");
}
}
public class CsvMerger
{
readonly TextWriter output;
const string OutputSeparator = "|";
bool canAddTypes = true;
readonly List<string> fieldNames = new List<string>();
readonly Dictionary<Guid, int[]> positionMap = new Dictionary<Guid, int[]>();
public CsvMerger(TextWriter output)
{
this.output = output;
}
public Guid RegisterType(params string[] dataLayout)
{
if (!this.canAddTypes)
throw new InvalidOperationException("Already started writing data, cannot add more source types");
int[] positions = new int[dataLayout.Length];
for (int i = 0; i < dataLayout.Length; i++)
{
int position = this.fieldNames.IndexOf(dataLayout[i]);
if (position == -1)
{
positions[i] = this.fieldNames.Count;
this.fieldNames.Add(dataLayout[i]);
}
else
{
positions[i] = position;
}
}
Guid typeKey = Guid.NewGuid();
this.positionMap[typeKey] = positions;
return typeKey;
}
public void WriteHeaders()
{
Console.WriteLine(string.Join(OutputSeparator, this.fieldNames));
}
public void WriteData(Guid type, params string[] data)
{
this.canAddTypes = false;
int[] map = this.positionMap[type];
string[] arrangedDataBuffer = new string[this.fieldNames.Count];
for (int i = 0; i < data.Length; i++)
{
arrangedDataBuffer[map[i]] = data[i];
}
this.output.WriteLine(string.Join(OutputSeparator, arrangedDataBuffer));
}
}
类程序
{
静态void Main(字符串[]参数)
{
var合并=新的CsvMerger(Console.Out);
Guid type1=merge.RegisterType(新[]{“Element1”、“Element2”、“Element3”});
Guid type2=merge.RegisterType(新[]{“Element3”、“Element5”、“Element6”});
合并。书面负责人();
合并。书面数据(类型1,“00000001”、“00000002”、“00000003”);
合并。书面数据(类型2,“00000003”、“00000005”、“00000006”);
}
}
公共类CsvMerger
{
只读文本编写器输出;
常量字符串输出分隔符=“|”;
bool-canAddTypes=true;
只读列表字段名=新列表();
只读字典位置映射=新字典();
公共CsvMerger(TextWriter输出)
{
这个。输出=输出;
}
公共Guid注册表类型(参数字符串[]dataLayout)
{
如果(!this.canAddTypes)
抛出新的InvalidOperationException(“已开始写入数据,无法添加更多源类型”);
int[]positions=newint[dataLayout.Length];
for(int i=0;i
您指的是XML格式的应用程序清单文件吗?您正在此处显示一些随机表格数据……请澄清您的问题,我们不知道您所指的“清单”是什么,因为它看起来与应用程序清单文件完全无关。您的术语有很多问题,使您很难或不可能理解这一切。“Manifest”没有解释,“element”可能实际上应该称为“column”,当您使用“row”这个词时,我认为您实际上是指“cell”或“element”。