如何将文件内容映射到现有字典c#

时间:2017-03-02 09:28:55

标签: c# file dictionary mapping

所以,我想要做的是根据一个唯一的项目映射两个不同文件的内容,在这种情况下是“sampleName”。其中一个文件的内容之前已添加到字典中,其中包含一个包含属性的列表和一个sampleName作为键。

此样本名称也出现在第二个文件中,该文件具有以下格式:

*Projectnummer;Datum;wetenschappelijke_naam;zakje;ring;klantnr         
"aNumber";"aDate";"scientificName";"123456";"12";"aNumber" etc..* 

其中“123456”是sampleName,这也发生在上一个字典中。

问题在这里,使用当前代码将错误的项添加到字典中的错误sampleCode(correctSamplesDict)。添加信息不是基于匹配的样本编号,而是基于文件中行的顺序。

如何我可以检查样本名称是否匹配,从而需要添加哪些信息?

try
    {
        if (File.Exists(fileName))
        {
            bool headerCollected = false;

            int projectNumberId = -1;
            int dateId = -1;
            int scientificNameId = -1;
            int sampleNameId = -1;
            int ringId = -1;
            int customerIdId = -1;

            StreamReader reader = new StreamReader(fileName);
            while (reader.Peek() > 4)
            {
                Sample sample = new Sample();
                string line = reader.ReadLine();
                line = line.Replace("\"" , string.Empty);
                string[] lineParts = line.Split((char)59);
                switch (headerCollected)
                {
                    case false:
                        if (line.ToUpper().Contains("PROJECTNUMMER"))
                        {
                            for (int i = 0; i < lineParts.Length; i ++)
                            {
                                if (lineParts[i].ToUpper().Trim().Contains("DATUM")) { dateId = i; }
                                if (lineParts[i].ToUpper().Trim().Contains("WETENSCHAPPELIJKE_NAAM")) { scientificNameId = i; }
                                if (lineParts[i].ToUpper().Trim().Contains("ZAKJE")) { sampleNameId = i; }
                                if (lineParts[i].ToUpper().Trim().Contains("RING")) {ringId = i; }
                                if (lineParts[i].ToUpper().Trim().Contains("KLANTNR")) { customerIdId = i; }
                                if (lineParts[i].ToUpper().Trim().Contains("PROJECTNUMMER")) { projectNumberId = i; }

                            }
                            headerCollected = true;
                        }

                        break;
                    case true:


                        if (dateId != -1 && lineParts.Length > dateId) { sample.ProjectDate = lineParts[dateId].Trim(); }
                        if (sampleNameId != -1 && lineParts.Length > sampleNameId) { sample.SampleName = lineParts[sampleNameId].Trim(); }
                        if (customerIdId != -1 && lineParts.Length > customerIdId) { int.TryParse(lineParts[customerIdId].Trim(), out sample.CustomerNumber); }
                        if (projectNumberId != -1 && lineParts.Length > projectNumberId) { sample.ProjectNumber = lineParts[projectNumberId].Trim(); }
                        if (ringId != -1 && lineParts.Length > ringId) { sample.RingNumber = lineParts[ringId].Trim(); }
                        if (scientificNameId != -1 && lineParts.Length > scientificNameId) { sample.ScientificName = lineParts[scientificNameId].Trim(); }

                        List<Sample> sampleProperties = null;
                        Sample sampleVal = null;

                        if (correctSamplesDict.TryGetValue(sample.SampleName, out sampleProperties))
                        {
                            foreach (KeyValuePair<string, List<Sample>> items in correctSamplesDict)
                            {
                                foreach (Sample sampleValue in items.Value)
                                {
                                        // initializes a new object for each iteration
                                        sampleVal = new Sample();
                                        sampleProperties = new List<Sample>();

                                        // These values still are correct                                   sampleVal.HeightOne = sampleValue.HeightOne;
                                        sampleVal.HeightTwo = sampleValue.HeightTwo;
                                        sampleVal.SizeOne = sampleValue.SizeOne;
                                        sampleVal.SizeTwo = sampleValue.SizeTwo;
                                        sampleVal.SampleName = sampleValue.SampleName;

                                        // mapping goes wrong here (wrong sample information to the wrong sampleName)
                                        sampleVal.ProjectDate = sample.ProjectDate;
                                        sampleVal.ProjectNumber = sample.ProjectNumber;
                                        sampleVal.CustomerNumber = sample.CustomerNumber;
                                        sampleVal.RingNumber = sample.RingNumber;
                                        sampleVal.ScientificName = sample.ScientificName;
                                        sampleProperties.Add(sampleVal);
                                    }                                                                                      
                            }
                            correctSamplesDict[sampleVal.SampleName] = sampleProperties;
                        }


                        break;
                    default:
                        break;
                }
            }

        }
    }

修改 示例文件如下所示: Sample_Name Size1 Size2 Height1 Height2

SampleName: SizeOne:    SizeTwo:    HeightOne:  HeightTwo:  
123 364 368 8921    8550
456 367 0   8948    0
789 367 0   9475    0

1 个答案:

答案 0 :(得分:1)

你的代码中很多东西都很奇怪:

  • 您在布尔变量上使用开关/大小写,而不是 if / else
  • 当您只使用Dictionary<string, List<<Sample>>时(根据我的理解),您使用Dictionary<string, List<<Sample>>来存储数据。

除此之外,您的问题来自代码的这一部分:

Dictionary<string, Sample>

你应该这样做

if (correctSamplesDict.TryGetValue(sample.SampleName, out sampleProperties))
{
    foreach (KeyValuePair<string, List<Sample>> items in correctSamplesDict)
    {
        foreach (Sample sampleValue in items.Value)
        {
            //skip...
        }
    }
    correctSamplesDict[sampleVal.SampleName] = sampleProperties;
}

您甚至不必替换字典中的列表,因为您现在直接在其中设置数据。