【问题标题】:SSIS Filtering records from flat fileSSIS从平面文件中过滤记录
【发布时间】:2020-01-25 21:43:14
【问题描述】:

我正在尝试过滤包含字符串 "Order" 的平面文件中的记录,然后将结果导入到 excel 文件中。

我为此使用了 Conditional Split 组件,条件为 FINDSTRING(MyColumn,"Order",1) > 0,但它不起作用 - 结果没有导入任何记录。

我的平面文件中的行如下所示:2020-01-01 11:51:00 3459 Order:1398 session:fr34skjdnn32kjsd ID:67889

你知道如何解决这个问题吗? 提前感谢您的帮助!

【问题讨论】:

    标签: c# ssis sql-server-data-tools


    【解决方案1】:

    下面的代码只是如何读取文件的示例。我需要查看更多的输入行才能使代码与任何输入一起工作。我已经解析这样的文本文件超过 45 年了,并且了解到单行输入永远不足以让这样的代码与所有输入一起工作

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Text.RegularExpressions;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            const string FILENAME = @"c:\temp\test.txt";
            static void Main(string[] args)
            {
                Order order = new Order();
                List<Order> orders = order.ReadFile(FILENAME);
            }
        }
        public class Order
        {
            public DateTime date { get; set; }
            public string order { get; set; }
            public string session { get; set; }
            public string id { get; set; }
    
            public List<Order> ReadFile(string filename)
            {
                StreamReader reader = new StreamReader(filename);
                List<Order> orders = new List<Order>();
                string line = "";
                while ((line = reader.ReadLine()) != null)
                {
                    Order newOrder = new Order();
                    orders.Add(newOrder);
                    string dateStr = line.Substring(0, 24);
                    newOrder.date = DateTime.ParseExact(dateStr, "yyyy-MM-dd hh:mm:ss ffff", System.Globalization.CultureInfo.InvariantCulture);
    
                    string pattern = @"(?'key'[^:]+):(?'value'[^\s]+)";
                    MatchCollection matches = Regex.Matches(line.Substring(24), pattern);
    
                    foreach (Match match in matches.Cast<Match>().AsEnumerable())
                    {
                        string key = match.Groups["key"].Value.Trim();
                        string value = match.Groups["value"].Value.Trim();
    
                        switch (key)
                        {
                            case "Order" :
                                newOrder.order = value;
                                break;
    
                            case "session":
                                newOrder.session = value;
                                break;
    
                            case "ID" :
                                newOrder.id = value;
                                break;
    
    
                        }
                    }
                }
                return orders;
            }
        }
    }
    

    【讨论】:

    • 在我的平面文件中,“Order”一词主要出现在冒号前面或引号中,例如:row1: 2020-01-01 11:51:00 3459 Order:1398 session:fr34skjdkjhu7jsd ID:67889 row2: 2020-01-01 11:51:00 3459 'Order' 1398 session:fr34skjdnn32kjsd ID:67869 并且某些情况如下所示: row3: 2020-01-01 11:51:00 3459 'Order 1398 session :fr34jhgbukybhj7kjsd ID:67879。所以我们只有 3 种情况:Order:, 'Order', 'Order 。有很多行没有“订单”,但我希望结果行只包含这个词。
    • 这看起来像手型数据,有很多不一致的地方,为什么很难解析。我需要查看更多的数据行才能完成适当的工作。这看起来像是我在大学里做的最后一个项目,教授在输入中出现拼写错误,使项目具有挑战性。我们不得不在 PUNCH CARDS 上编写代码,最终用 FORTRAN 编写了 500 多张卡片,而废纸​​篓中的卡片比最终项目中的要多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 2011-09-03
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    相关资源
    最近更新 更多