создать XML-файл из CSV с использованием C # в компоненте сценария ssis - PullRequest
0 голосов
/ 25 октября 2019

У меня есть данные файла страховых полисов в формате csv, которые мне нужно преобразовать в xml-файл с помощью ssis. Теперь, когда у меня есть уникальные страховые номера в CSV, я могу сгенерировать XML-файл в требуемом формате, но есть многократные страховые номера. НапримерСемья застраховала свои автомобили, имея 4 водителя и 4 автомобиля, поэтому в файле CSV есть 4 записи этого страхового номера, который должен быть 1 блоком в xml, причем страховой номер встречается 1 раз, а все записи водителя и транспортного средства - 4 раза под 1 страховым номером. tag.

Я создал XML-файл, если нет повторений номера водителя, транспортного средства или страховки. Я очень новичок в SSIS и никогда не занимался кодированием на c #, так что если кто-то может мне помочь с кодом. Как перебрать столбцы, если они повторяются, и сделать для них записи дочерних узлов.

Это код, который я использовал в компоненте сценария ssis, чтобы сгенерировать требуемую структуру xml, но она работает только в том случае, еслинет повторения.

string[] lines = File.ReadAllLines(@"H:\SSIS\Source\Intermediate.csv");

XElement xml = new XElement("Submissions",
    from str in lines
    let columns = str.Split(',')
    select new XElement("SubmissionEntry",
        new XElement("SubmissionID", columns[0]),
        new XElement("PolicyNumber", columns[1]),
        new XElement("OfferingCodeIdentifier", columns[2]),
        new XElement("BaseState", columns[3]),
        new XElement("EffectiveDate", columns[4]),
        new XElement("PeriodStart", columns[5]),
        new XElement("RateASOfDate", columns[6]),
        new XElement("RenewalNumber", columns[7]),
        new XElement("RatingCapFactor", columns[8]),
        new XElement("ConversionFactor", columns[9]),
        new XElement("ClaimsFreeCount", columns[10]),
        new XElement("PaidInFull", columns[11]),
        new XElement("IsHomeOwner", columns[12]),
        new XElement("IsNewBusinessTransfer", columns[13]),
        new XElement("IsNamedNonOwnerPolicy ", columns[14]),
        new XElement("LVTTier", columns[15]),
        new XElement("PNIBirthDate", columns[16]),
        new XElement("PNIPostalCode", columns[17]),
        new XElement("CreditStatus", columns[18]),
        new XElement("EquivalentCreditScore ", columns[19]),
        new XElement("CreditScore", columns[20]),
        new XElement("DeliverySource", columns[21]),
        new XElement("ChannelGroup", columns[22]),
        new XElement("LineCoverages",
            new XElement("LineCovEntry",
                new XElement("PatternCode", columns[23]),
                new XElement("CoverageTerms",
                    new XElement("CovTermCodeIdentifier", columns[24]),
                    new XElement("CovTermValue", columns[25])))),
        new XElement("PolicyDrivers",
            new XElement("DriverEntry",
                new XElement("DriverID", columns[26]),
                new XElement("DriverType", columns[27]),
                new XElement("Excluded", columns[28]),
                new XElement("RelationToApplicant", columns[29]),
                new XElement("DateOfBirth", columns[30]),
                new XElement("Gender", columns[31]),
                new XElement("MaritalStatus", columns[32]),
                new XElement("AgeLicensed", columns[33]),
                new XElement("LicenseStatus", columns[34]),
                new XElement("LicenseCountry", columns[35]),
                new XElement("UnverifiedDriver", columns[36]),
                new XElement("EmploymentStatus", columns[37]),
                new XElement("DriverImprovementCourse", columns[38]),
                new XElement("DriverImprovementCourse", columns[39]),
                    new XElement("IncidentEntry",
                        new XElement("IncidentID", columns[40]),
                        new XElement("IncidentDate", columns[41]),
                        new XElement("ViolationCode", columns[42]),
                        new XElement("OverrideCategory", columns[43]),
                        new XElement("LossAmount", columns[44])))),
        new XElement("PersonalVehicles",
            new XElement("VehicleEntry",
                new XElement("VehicleID", columns[45]),
                new XElement("VehicleYear", columns[46]),
                new XElement("GaragePostalCode", columns[47]),
                new XElement("PrimaryUse", columns[48]),
                new XElement("GaragedOutOfState3MonthsPerYear", columns[49]),
                new XElement("SecurityTypeCode", columns[50])),
                new XElement("RAPA",
                    new XElement("Rapa_Bi", columns[51]),
                    new XElement("Rapa_Coll", columns[52]),
                    new XElement("Rapa_Comp", columns[53]),
                    new XElement("Rapa_Med", columns[54]),
                    new XElement("Rapa_Pd", columns[55]),
                    new XElement("Rapa_Pip", columns[56])),
                    new XElement("VehicleCovEntry",
                        new XElement("PatternCode", columns[57]),
                        new XElement("CoverageTerm",
                            new XElement("CovTermCodeIdentifier", columns[58]),
                            new XElement("CovTermValue", columns[59]))))));

xml.Save(@"H:\SSIS\Destination\demo xml.xml");

1 Ответ

0 голосов
/ 25 октября 2019

Вы можете читать CSV в объекты и преобразовывать построенные объекты в XElement, когда вам нужен документ XML.

Пример:

public class Example
{
    public class Driver
    {
        public string DriverId { get; set; }

        // .. add remaining properties

        public static Driver FromCsv(string[] row)
        {
            return new Driver
            {
                DriverId = row[26],
                // fill remaining driver properties with columns data
            };
        }

        public XElement ToXElement()
        {
            return new XElement("DriverEntry",
                new XElement("DriverID", DriverId)
                /* add remaining properties as XElement's */);
        }
    }

    public class Submission
    {
        public string SubmissionId { get; set; }

        public string PolicyNumber { get; set; }

        // .. add remaining properties

        public List<Driver> PolicyDrivers { get; set; }

        public static Submission FromCsv(string[] row)
        {
            return new Submission
            {
                SubmissionId = row[0],
                PolicyNumber = row[1],
                PolicyDrivers = new List<Driver> { Driver.FromCsv(row) },
                // fill remaining submission properties with columns data
            };
        }

        public XElement ToXElement()
        {
            return new XElement("SubmissionEntry",
                new XElement("SubmissionID", SubmissionId),
                new XElement("PolicyNumber", PolicyNumber),
                /* add remaining properties as XElement's */
                new XElement("PolicyDrivers",
                    PolicyDrivers.Select(d => d.ToXElement())));
        }
    }

    public static void ConvertToXml()
    {
        string[] lines = File.ReadAllLines(@"H:\SSIS\Source\Intermediate.csv");

        Dictionary<string, Submission> submissions = new Dictionary<string, Submission>();

        foreach (var line in lines)
        {
            var row = line.Split(',');

            var submissionId = row[0];

            if (submissions.ContainsKey(submissionId))
            {
                var submission = submissions[submissionId];

                submission.PolicyDrivers.Add(Driver.FromCsv(row));
            }
            else
            {

                submissions[submissionId] = Submission.FromCsv(row);
            }
        }

        XElement xml = new XElement("Submissions", submissions.Values.Select(s => s.ToXElement()));

        xml.Save(@"H:\SSIS\Destination\demo xml.xml");
    }
}

В нашем примере мы создаем Submission и Driver объекты, в которых отправка может содержать один или несколько PolicyDrivers. Каждая отправка хранится в словаре, где ключом является SubmissionID - поэтому, если для одного SubmissionID имеется несколько записей, PolicyDrivers будут объединены вместе.

Это означает, что только PolicyDrivers изменится в случае столкновения на SubmissionID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...