Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将不同格式的清单合并到一个清单中?_C#_Manifest - Fatal编程技术网

C# 如何将不同格式的清单合并到一个清单中?

C# 如何将不同格式的清单合并到一个清单中?,c#,manifest,C#,Manifest,我正在寻找一些关于如何将多个不同清单合并为一个清单的提示/建议,该清单捕获每个清单的每个元素 假设我有以下3个清单,格式如下。正如您所看到的,有些元素重复,有些元素是清单所独有的。此外,清单在每个元素下包含数千行 清单1: Element1|Element2|Element4|Element5| 00000001|00000002|00000004|00000005| 清单2: Element2|Element3|Element4|Element5| 00000002|00000003|000

我正在寻找一些关于如何将多个不同清单合并为一个清单的提示/建议,该清单捕获每个清单的每个元素

假设我有以下3个清单,格式如下。正如您所看到的,有些元素重复,有些元素是清单所独有的。此外,清单在每个元素下包含数千行

清单1:

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”。