示例#1
0
        public void Parse_InputFile_ParsesFile()
        {
            var ds = new DataSet("Book")
                     .WithTable(new DataTable("GeneralInfo")
                                .WithColumn("Title", MappingType.Element)
                                .WithColumn("Author", MappingType.Element)
                                .WithColumn("Language", MappingType.Element))
                     .WithTable(new DataTable("Chapters")
                                .Empty())
                     .WithTable(new DataTable("Chapter")
                                .WithColumn("Number")
                                .WithColumn("Title"))
                     .WithRelation("Chapters", "Chapter");

            var s = new List <ISkip>
            {
                Skip.BlankLines
            };

            var p = new Dictionary <String, IList <IParse> >
            {
                {
                    "GeneralInfo",
                    new List <IParse>
                    {
                        Parse.Key("Title").Regex(new Regex(@"Title:\s*(.+)")),
                        Parse.Key("Author").FromLine(2).Regex(new Regex(@"Author:\s*(.+)")),
                        Parse.Key("Language").FromLine(5).Regex(new Regex(@"Language:\s*(.+)"))
                    }
                }
            };

            var transformation = new TransformFromSingleSkip(
                Skip.IfDoesNotMatch(new Regex(@"^(\s*)CHAPTER(.*)")));

            var d = new Dictionary <String, IList <IParse> >
            {
                {
                    "Chapter",
                    new List <IParse>
                    {
                        Parse.Key("Number").Regex(new Regex(@"CHAPTER\s*([A-Z]+)\.")),
                        Parse.Key("Title").Regex(new Regex(@"CHAPTER\s*.*\.\s*(.+)$")),
                    }
                }
            };

            var lines = FromText(InputFile);

            var parser = new Parser(p, s, transformation, d);
            var parsed = parser.Parse(lines);

            var xml = parsed.ToDataSet(ds).GetXml();

            Assert.AreEqual(ExpectedXml, xml);
        }
示例#2
0
        public void Parse_Details_ApplyDetailsInEveryLine2()
        {
            var p = new Dictionary <String, IList <IParse> >
            {
                {
                    "Header",
                    new List <IParse>
                    {
                        new ParseFromRegex(key: "Value", pattern: new Regex(@"Value:\s*(\d+)"))
                    }
                }
            };
            var s = new List <ISkip>();
            var t = new TransformFromSingleSkip(
                new SkipBeforeRegexAndAfterRegex(
                    before: new Regex(@"-- Details --"),
                    after: new Regex(@"-- End of Details --")));

            var d = new Dictionary <String, IList <IParse> >
            {
                {
                    "Details",
                    new List <IParse>
                    {
                        new ParseFromGenerator <int>(key: "Code", seed: 0, next: (current) => current + 1),
                        new ParseFromRegex(key: "Name", pattern: new Regex(@"^(\d)\s*(\w+)\s*(\d+)(.*)$"), factory: (group) => group["2"]),
                        new ParseFromRegex(key: "Value", pattern: new Regex(@"^(\d)\s*(\w+)\s*(\d+)(.*)$"), factory: (group) => group["3"])
                    }
                }
            };

            var lines = FromText(@"
Value: 20
-- Details --
Item1 10
Item2 10
-- End of Details --");

            var parser = new Parser(p, s, t, d);
            var ds     = parser.Parse(lines);

            Assert.AreEqual("20", ds["Header"]["Value"]);

            Assert.IsTrue(ds.ContainsKey("Details[1]"));
            Assert.AreEqual("1", ds["Details[1]"]["Code"]);

            Assert.IsTrue(ds.ContainsKey("Details[2]"));
            Assert.AreEqual("2", ds["Details[2]"]["Code"]);
        }
示例#3
0
        public void Parse_InputFile_ParsesFile()
        {
            var ds = new DataSet("Invoice")
                     .WithTable(new DataTable("Billing")
                                .WithColumn("Number")
                                .WithColumn("Date")
                                .WithColumn("Total"))
                     .WithTable(new DataTable("Customer")
                                .WithColumn("Name"))
                     .WithTable(new DataTable("Address")
                                .WithColumn("AddressLine")
                                .WithColumn("City"))
                     .WithRelation("Customer", "Address")
                     .WithTable(new DataTable("Supplier")
                                .WithColumn("Contact")
                                .WithColumn("Seller"))
                     .WithTable(new DataTable("Products")
                                .Empty())
                     .WithTable(new DataTable("Product")
                                .WithColumn("Code")
                                .WithColumn("Description")
                                .WithColumn("Quantity")
                                .WithColumn("UnitPrice")
                                .WithColumn("Total"))
                     .WithRelation("Products", "Product");

            var s = new List <ISkip>
            {
                new SkipIfMatches(new Regex(@"(\+([\-\+])+\+)"))
            };

            var p = new Dictionary <String, IList <IParse> >
            {
                {
                    "Billing",
                    new List <IParse>
                    {
                        new ParseFromLineNumberWithRegex(key: "Number", lineNumber: 2, pattern: new Regex(@"Number\s+:\s+(\d+)")),
                        new ParseFromLineNumberWithRegex(key: "Date", lineNumber: 3, pattern: new Regex(@"Date\s+:\s+(\d{1,4}\-\d{1,2}\-\d{1,2})")),
                        new ParseFromLineNumberWithRegex(key: "Total", lineNumber: -1, pattern: new Regex(@"\|\s+([\d\,\.]+)\s+\|")),
                    }
                },
                {
                    "Customer",
                    new List <IParse>
                    {
                        new ParseFromLineNumberWithRegex(key: "Name", lineNumber: 2, pattern: new Regex(@"\|\s+Customer\s+:\s+([\w\s]+)Number"))
                    }
                },
                {
                    "Address",
                    new List <IParse>
                    {
                        new ParseFromLineNumberWithRegex(key: "AddressLine", lineNumber: 4, pattern: new Regex(@"\|\s+Address\s+:([\w\s\-_\.]+)Seller")),
                        new ParseFromLineNumberWithRegex(key: "City", lineNumber: 5, pattern: new Regex(@"\|\s+City\s+:([\w\s\-_\.]+)\|")),
                    }
                },
                {
                    "Supplier",
                    new List <IParse>
                    {
                        new ParseFromLineNumberWithRegex(key: "Contact", lineNumber: 3, pattern: new Regex(@"\|\s+Contact\s+:([\w\s\-_\.]+)Date")),
                        new ParseFromLineNumberWithRegex(key: "Seller", lineNumber: 4, pattern: new Regex(@"Seller\s+:([\w\s\-_\.]+)\|")),
                    }
                }
            };

            var transformation = new TransformFromSingleSkip(
                new SkipBeforeRegexAndAfterRegex(
                    before: new Regex(@"\|\s+Code\s+.+Total\s+\|"),
                    after: new Regex(@"\|\s+\|\s+T O T A L\s+\|")));

            var detailRegex = new Regex(@"\|\s+(?<Code>[\w\-]+)\s+(?<Description>[\w\s]{1,48})\s+(?<Quantity>\d+)\s+(?<UnitPrice>[\d\,\.]+)\s+(?<Total>[\d\,\.]+)\s+\|");
            var d           = new Dictionary <String, IList <IParse> >
            {
                {
                    "Product",
                    new List <IParse>
                    {
                        new ParseFromRegex(key: "Code", pattern: detailRegex, factory: (g) => g["Code"]),
                        new ParseFromRegex(key: "Description", pattern: detailRegex, factory: (g) => g["Description"]),
                        new ParseFromRegex(key: "Quantity", pattern: detailRegex, factory: (g) => g["Quantity"]),
                        new ParseFromRegex(key: "UnitPrice", pattern: detailRegex, factory: (g) => g["UnitPrice"]),
                        new ParseFromRegex(key: "Total", pattern: detailRegex, factory: (g) => g["Total"]),
                    }
                }
            };

            var lines = FromText(InputFile);

            var parser = new Parser(p, s, transformation, d);
            var parsed = parser.Parse(lines);

            var xml = parsed.ToDataSet(ds).GetXml();

            Assert.AreEqual(ExpectedXml, xml);
        }